文档章节

写了N久的Yii 发现对数据库设计还是小白~

阿北2017
 阿北2017
发布于 2017/05/08 10:00
字数 775
阅读 951
收藏 23

最近在北哥qq群里发现很多人对数据库的命名规则以及yii2和mysql的一些东东比较迷糊,这里把北哥开发项目时候对mysql的一些规则分享给大家,不见得最优,但求对你有点用处就好,除此之外,还有几个gii和数据库搭配小技巧。

数据表的脚本化

请使用migrate来处理新建、修改、删除表等操作,虽然它并不能进行数据的还原,但是对于结构,还是不错的。

视频学习

库表的一些设置法则

  • 表字符集选择UTF8,如果要存放emoji,则统一选择UTF8mb4(MySQL5.5.3以后支持)
  • 存储引擎使用InnoDB
  • 不在数据库中存放图片、文件等
  • 变成字符串尽量使用varchar类型
  • 库名、表名、字段名均不适用保留字
  • 库名、表名、字段名、索引名使用小写字母
  • 多个单词用下划线,要做到见名知意
  • 库表名不要设计过长,越少越好

字段的一些规范

  • 除非你的字段真的想存Null,否则所有字段均定义为Not Null
  • 使用varchar来存储变长字符串,但是要注意varchar(M)里的M是指字符数而不是字节数
  • 字段类型满足最小化原则,非负整数使用unsigned
  • 浮点数使用decimal来存储,用float有时候会有问题
  • 少用blob text
  • 使用datetime存放时间(不用timestamp,因只能存到2038年,而且现在在占位上和datetime节省优势越来越低)

为何定义不用Null?

1、对于InnoDB来说,需要有额外的字节来存储,浪费。 2、一个表内的Null过多会影响优化器。

关于将时间存储为int格式的问题

这更多算一个mysql的技巧,将时间存储为int的时间戳形式,这样的设置可能带来运算上的方便,但是也失去了时间类型的意义,有利有弊吧。

表是单数还是复数

在Laravel框架中对表的命名有一些推荐(均为复数),Yii并没有推荐,北哥习惯使用单数,代表一种抽象类型,而且使用gii的时候也特别方便。

当然这不是硬性的,但是你需要统一,不要一会单数一会复数。

关于字段备注

首先要说的是,每个数据表的字段必须要写,除此之外,当你用gii生成一个模型的时候,选择上“Generate Labels from DB Comments”,则生成的模型中attributeLables的值自动就是你的字段备注,方便的不要不要的~

关于表前缀的问题

当我们数据库中存在不同应用的时候,我们喜欢用表前缀来区分,比如discuz_、ecshop_,在使用gii的时候,选择上“Use Table Prefix”,则生成的模型不会带这些前缀,且自动适配,这个功能也很贴心。

© 著作权归作者所有

共有 人打赏支持
阿北2017
粉丝 67
博文 58
码字总数 74348
作品 0
洛阳
私信 提问
加载中

评论(8)

xper
xper
为何定义不用Null?
sql难写,过滤空和null,麻烦
aszx0413
aszx0413

引用来自“蓝水晶飞机”的评论

引用来自“aszx0413”的评论

引用来自“蓝水晶飞机”的评论

时间戳数值应该是长整型。
以秒为单位的话就是10位整数,用int足以

@aszx0413 一般来说都习惯用毫秒单位的哦
@蓝水晶飞机 毫秒单位没有什么优势啊
php的time()就是返回秒时间戳
date()的第二个参数也接受秒时间戳
一行白鹭上青天
一行白鹭上青天
啦啦
蓝水晶飞机
蓝水晶飞机

引用来自“aszx0413”的评论

引用来自“蓝水晶飞机”的评论

时间戳数值应该是长整型。
以秒为单位的话就是10位整数,用int足以

@aszx0413 一般来说都习惯用毫秒单位的哦
aszx0413
aszx0413

引用来自“蓝水晶飞机”的评论

时间戳数值应该是长整型。
以秒为单位的话就是10位整数,用int足以
名字不好取啊啊
名字不好取啊啊
get
蓝水晶飞机
蓝水晶飞机
时间戳数值应该是长整型。
爱吃大肉包
爱吃大肉包
1、对于InnoDB来说,需要有额外的字节来存储,浪费。 2、一个表内的Null过多会影响优化器。
当Yii遇上不支持pdo_mysql的服务器

(2014-10-9,在使用过程中仍发现不少问题,已迁移至https://github.com/xiilei/php-functions/tree/master/yii,不定期维护,下列代码不再更新) 这真是一件很郁闷的事情,项目的一个子项目(cm...

xilei
2014/03/28
0
2
yii2 window composer 安装

最近在学习PHP,着手找一个能快速上手的框架来学习。一开始看兄弟连视频时候讲师推荐ThinkPHP。于是我选择了ThinkPHP来尝试,这个框架的上手难度系数不大,能快速开发一款应用。适合小型的企...

Gjanuary
2017/06/06
0
0
yii2开发中19条推荐实践(阿北总结)

虽然每个人的编程风格不同,但是有些建议能让你的代码更加规范和稳定,本次就我这次网站更新总结如下几点,希望对你的yii2学习和使用有所帮助。 环境说明 服务器环境: CentOS 开发环境及IDE...

阿北2017
2018/06/02
0
0
从Yii2登陆中看PHP的工厂模式

首先,简单介绍下工厂模式: 在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其...

卖小女孩的小火柴
2015/05/25
2.2K
7
使用yii2-queue结合redis来实现队列功能

使用yii2-queue结合redis来实现队列功能 为什么用它? 其实之前用过activemq,但是这个东西基于Java的,得装一堆东西,还得配置,而且我只是比较简单的功能,所以就没打算上这个,不过后面了解...

栋栋也疯狂
04/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JFinal开发的旅游线路营销Saas平台演示系统我部署了一个

今天部署了一个旅游线路营销管理系统的演示版: 演示地址:http://lvyou.jfinalxueyuan.com 演示账号:(暂时只给一个门店版的吧,批发商和总部的如果需要 演示看看 单独联系我微信:1876673...

山东-小木
今天
2
0
如何学习大数据技术

学习大数据技术,首先要明确大数据的概念。 大数据的概念作者认为有如下几点: 1.数据的来源多样性。例如关系数据库+文本+excel等 2.数据量大。TB级别的数据。 3.业务应用领域。实时性高与实...

董黎明
今天
3
0
开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有

先看整体效果 把简单的东西“傻瓜化”是软件开发追求的目标之一。请看下图: 左边是在 application.yml 里配置了3个生成器,右边可以直接注入到代码中使用,注意,不用写任何代码。这酸爽。 ...

花漾年华
今天
1
0
算法我也不知道有没有下一个---一个题目的开端(索引堆与图)

病痛了一周,折磨来折磨去,终于还是平静了下来,现在能把上周末"贯穿"学到的最后一个基础数据结构的知识给沉淀沉淀了。也是即将再单位分享的东西:图论。这东西,想当年大二,学校的时候,只...

心中的理想乡
今天
1
0
Synchronized和Lock的区别

锁类型: 可重入锁:在执行对象中所有的同步方法时,不必再次去获取锁 可中断锁:在等待获取锁过程中可中断 读写锁:对线程的读写分为两个部分,读过程中多线程可一起访问readLock,写过程中...

最胖的瘦子
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部