mysql数据库性能不比oracle数据库,所以设计上,和oracle有一些不同。下面总结一些互联网产品的数据库设计。

1.主键

主键可以使用bigint(20) unsigned也可以使用varchar,使用bigint,可以设置为自增主键auto_increment。使用varchar,要生成主键。

2.gmt_create、gmt_modified

在TB所有表中都添加gmt_create、gmt_modified字段,都是datetime类型。gmt_create表示记录创建时间,gmt_modified表示最近修改时间,如果记录没有修改,gmt_create和gmt_modified一致。

那么,这两个字段可以做什么用呢?这两个字段可以方便统计每天对某个表做了多少次的DML。另一种统计方式可以通过binlog。

查看昨天insert:

select * FROM  test_table  WHERE 
gmt_create < date_format(DATE(now()), '%Y-%m-%e %H-%i-%s') AND 
gmt_create >= date_format(DATE(date_add(now(), INTERVAL - 1 DAY)),'%Y-%m-%e %H-%i-%s');

查看昨天update:

select * FROM test_table WHERE gmt_create < date_format(DATE(now()), '%Y-%m-%e %H-%i-%s')
AND gmt_create >= date_format(DATE(date_add(now(), INTERVAL - 1 DAY)),'%Y-%m-%e %H-%i-%s')
AND date_add(gmt_create, INTERVAL - 1 DAY) != date_add(gmt_modified, INTERVAL - 1 DAY)

3.逻辑删除 is_deleted

数据库不做物理删除,只做逻辑删除,用is_deleted做逻辑删除,如果删除,则为1,不删除则为0.is_deleted字段可以使用tinyint型。

4.禁止使用物理外键,使用逻辑外键

由于mysql性能不如oracle,外键还是一个比较消耗性能的东西,所以我们不要使用物理外键,就是我们在建表的时候,禁止使用foreign key。

例如表b记录了表a的id,我们只需在表b中添加一列:aid就可以了,然后通过程序来控制外键关系。

5.命名规范

1.库名,表名,字段名必须都用小写字母,并用下划线_分隔,并且见名知意,使用名词。

原因如下:

a) MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大小写不敏感。如果是2,以实际情况存储,但以小写比较。
b) 如果大小写混合用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。
c) 字段名显示区分大小写,但实际使用不区分,即不可以建立两个名字一样但大小写不一样的字段。
d) 为了统一规范, 库名、表名、字段名使用小写字母。

6.使用innoDB存储引擎

5.5以后的默认引擘,支持事务,行级锁,更好的恢复性,高并发下性能更好,对多核,大内存,ssd等硬件支持更好。

7.关于数据类型

a.存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。

例如:对于金钱的存储,使用decimal,或者以分为单位,用bigint(20) unsigned。
b.使用UNSIGNED存储非负数值。同样的字节数,存储的数值范围更大。如tinyint 有符号为 -128-127,无符号为0-255
c.建议使用INT UNSIGNED存储IPV4。
使用INT UNSIGNED而不是char(15)来存储ipv4地址,通过MySQL函数inet_ntoa和inet_aton来进行转化。Ipv6地址目前没有转化函数,需要使用DECIMAL或者两个bigINT来存储。例如:
SELECT INET_ATON('209.207.224.40');
3520061480
SELECT INET_NTOA(3520061480);
209.207.224.40

d.整形定义中不添加(4),比如使用INT,而不是INT(4)

注意数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,python、java客户端等不具备这个功能。

e.使用短数据类型,比如取值范围为0-80时,使用TINYINT UNSIGNED。

f.不建议使用ENUM类型,使用TINYINT来代替。

ENUM,有三个问题:添加新的值要做DDL,默认值问题(将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值),索引值问题(插入数字实际是插入索引对应的值)
实例:
drop table if exists t;
create table t(sex enum('0','1'));
insert into t values(1);
insert into t values('3');
select * from t;
+------+
| sex  |
+------+
| 0    |
|      |
+------+
2 rows in set (0.00 sec)
g.尽可能不使用TEXT、BLOB类型。
h.VARCHAR(N),N表示存的个数,比如:VARCHAR(10) 下面语句都可以成功:
update test set testvarchar='一二三四五六七八九十' where id=1
update test set testvarchar='1234567890' where id=1
update test set testvarchar='abcdefghij' where id=1
i.存储年使用YEAR类型。
j.存储日期使用DATE类型。
k.存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。
l.将过大字段拆分到其他表中。
m.禁止在数据库中使用VARBINARY、BLOB存储图片、文件等

8.适当建立索引

非唯一索引必须按照“idx_字段名称_字段名称[_字段名]”进行命名。
唯一索引必须按照“uniq_字段名称_字段名称[_字段名]”进行命名。
索引名称必须使用小写。
索引中的字段数建议不超过5个。
单张表的索引数量控制在5个以内。
不建议使用%前缀模糊查询,例如LIKE “%weibo”。
合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。
唯一键由3个以下字段组成,并且字段都是整形时,使用唯一键作为主键。
没有唯一键或者唯一键不符合5中的条件时,使用自增id作为主键。
唯一键不和主键重复。
索引字段的顺序需要考虑字段值去重之后的个数,个数多的放在前面。
ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面。

参考:http://lgdvsehome.blog.51cto.com/3360656/1272044

互联网产品mysql数据库设计总结相关推荐

  1. 不属于mysql常量的是_MySQL中,下面______常量的写法是不正确的?-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL中,下面______常量的写法是不正确的?[?ж???] A:'2.1E5 B:0x123abc C:b'121' D:null MySQL数据库设计与应用章节测 ...

  2. mysql数据库设计的原则_MySQL数据库设计原则

    转自 http://www.supidea.com/post/mysql_design_database.aspx MySQL数据库设计原则 MySQL对于成为一个非常快速的数据库服务器有着当之无愧的 ...

  3. MYSQL数据库设计原则

    一.MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大 ...

  4. 数据库-优化-MYSQL数据库设计原则

    MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大sq ...

  5. 互联网产品用户体验设计的三大定律

    好友发过来一PPT,文件名是互联网产品的体验设计,认真看完,收获颇多,其中印象最深刻的是用户体验可用性的三大定律,正好FasterSoft正在打造互联网精品平台iWorld,最需要的时候好东西就上门来 ...

  6. mysql数据库设计原则_mysql数据库设计总结

    作者:腾讯云技术社区 链接:https://www.zhihu.com/question/19719997/answer/154809252 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

  7. mysql数据库慕课答案_智慧树MySQL数据库设计与应用慕课答案

    智慧树MySQL数据库设计与应用慕课答案 更多相关问题 [单选] TDD-LTE中一个子帧包含()时隙, [多选] 调整天线下倾角可以改变:() [单选] 多级破碎时,总破碎比等于多机破碎比的(). ...

  8. 17互联网产品的交互设计(文智老师公开课笔记)

    互联网产品的交互设计 交互设计之父 交互设计定义 几个容易混淆的概念 如何炼成交互设计技能 交互设计几个重要的性质.原则.准则 17.1交互设计之父 比尔·莫格里奇(1943.6.25-2012.9. ...

  9. mysql函数包含的意思_MySQL存储函数的特性说明中,______表示函数体不包含SQL语句。-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL存储函数的特性说明中,______表示函数体不包含SQL语句.[?????] A:containssql B:modifiessqldata C:nosql D: ...

最新文章

  1. 【微信公众号开发】获取并保存access_token、jsapi_ticket票据(可用于微信分享、语音识别等等)...
  2. 几种和生成网络相似的纠缠网络(接近人脑)
  3. WordPress按钮秒支付插件发布,支持微信支付,支付宝,银联,京东,苏宁,易宝支付...
  4. Python设计模式之外观模式实例讲解
  5. MySQL服务的启动与停止-使用图形界面工具
  6. P1833 樱花——混合背包 二进制优化成01背包
  7. c_str()的用法
  8. NSX控制平面和静态路由更新流程1
  9. ShutIt:一个基于Python的shell自动化框架
  10. Redis中的value包含中文显示的问题?
  11. ORACLE中null的排序问题
  12. html不同app可以缓存多少,HTML5 AppCache和普通浏览器缓存之间有什么区别?
  13. 自动驾驶 5-1 比例积分微分 (PID) 控制Lesson 1: Proportional-Integral-Derivative (PID) Control
  14. Android平台下渗透测试工具大集合
  15. 【JavaWeb开发】“web应用程序的根目录“与“web站点的根目录“的分析
  16. 常用的vue组件库总结
  17. 90KB的3D游戏(像CS一样)[汇编界又一奇迹]绝对震撼,操作和CS一样!
  18. 这个可以有!百度大脑EasyDL新发布EasyData搞定AI开发中的数据管理问题
  19. 逻辑思维题总结与例题分析
  20. 微信大数据:中国人怎么过国庆长假?

热门文章

  1. 哪些物联网应用最适合采用雾计算?
  2. iOS 秒数转换成时间,时,分,秒
  3. 《Effective C++》第8章 定制new和delete-读书笔记
  4. IBM会话设置和覆盖规则
  5. 缺少HTML Doctype造成的样式问题
  6. NoticeView
  7. 性能优化工具 MVC Mini Profiler
  8. tar、gzip、gunzip、bzip2、zip、unzip
  9. 快速浏览Silverlight3 Beta:当HLSL遇上Silverlight
  10. WebSocket 协议