网站改版301,深圳市创想三维科技有限公司,郑州做网站哪家好,企业管理系统本文首先探讨下数据库设计的三大范式#xff0c;因为范式只是给出了数据库设计的原则#xff0c;并没有告诉我们实际操作中应该怎样操作#xff0c;应该注意什么#xff0c;所以我们还会谈下实际工作中需要注意的具体操作问题。
三大范式 首先放出三大范式内容#xff0c…本文首先探讨下数据库设计的三大范式因为范式只是给出了数据库设计的原则并没有告诉我们实际操作中应该怎样操作应该注意什么所以我们还会谈下实际工作中需要注意的具体操作问题。
三大范式 首先放出三大范式内容然后再进行解释
第一范式确保每列的原子性.如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.(只要是关系型数据库都满足1NF)
第二范式如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式.
第三范式如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键列,则满足第三范式。
一范式就是属性不可分割。属性是什么就是表中的字段。不可分割的意思就按字面理解就是最小单位不能再分成更小单位了。这个字段只能是一个值不能被拆分成多个字段。不过能不能分割并没有绝对的答案看需求也就是看你的设计目标而定。
举例学生信息组成学生信息表有姓名、年龄、性别、学号等信息组成。姓名不可拆分吧所以可以作为该表的一个字段。但我要说这个表要在国外使用呢人家姓和名要分开都有特别的意义所以姓名字段是可拆分的分为姓字段和名字段。简单来说一范式是关系数据库的基础但字段是否真的不可拆分根据你的设计目标而定。
二范式就是要有主键要求其他字段都依赖于主键。为什么要有主键没有主键就没有唯一性没有唯一性在集合中就定位不到这行记录所以要主键。其他字段为什么要依赖于主键因为不依赖于主键就找不到他们。如果有同学不理解依赖这个词可以勉强用“相关”这个词代替也就是说其他字段必须和它们的主键相关。因为不相关的东西不应该放在一行记录里。
举例学生信息组成学生表姓名可以做主键么不能因为同名的话就不唯一了所以需要学号这样的唯一编码才行。那么其他字段依赖于主键是什么意思就是“张三”同学的年龄和性别等字段不能存储别人的年龄性别必须是他自己的因为张三的学号信息就决定了这行记录归张三所有不能给无关人员使用。
三范式就是要消除传递依赖方便理解可以看做是“消除冗余”。消除冗余应该比较好理解一些就是各种信息只在一个地方存储不出现在多张表中。比如说大学分了很多系中文系、英语系、计算机系……这个系别管理表信息有以下字段组成系编号系主任系简介系架构。那么再回到学生信息表张三同学的年龄、性别、学号都有了我能不能把他的系编号系主任、系简介也一起存着如果你问三范式当然不行因为三范式不同意。因为系编号系主任、系简介已经存在系别管理表中你再存入学生信息表就是冗余了。三范式中说的传递依赖就出现了。这个时候学生信息表中系主任信息是不是依赖于系编号了而这个表的主键可是学号啊所以按照三范式处理这个问题的时候学生表就只能增加一个系编号字段。这样既能根据系编号找到系别信息又避免了冗余存储的问题。
还有要强调的就是所谓的范式是用来学习参考的设计的时候根据情况未必一定要遵守。因为在数据库数据量特别大并且访问并发也大的情况下可能要采用反范式设计来提高数据库响应速度不过这里不在过多讨论有兴趣的同学可以到这个网址查看具体内容该文档针对mysql的优化做了详细说明https://wenku.baidu.com/view/aa43ecc3aa00b52acfc7ca94.html
实际操作规范mysql 表设计 库名、表名、字段名必须使用小写字母“_”分割且名称长度不超过12个字符并且要做到见名知意。 建议使用InnoDB存储引擎。 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。 建议使用UNSIGNED存储非负数值。 建议使用INT UNSIGNED存储IPV4。 整形定义中不添加长度比如使用INT而不是INT(4)。 使用短数据类型比如取值范围为0-80时使用TINYINT UNSIGNED。 不建议使用ENUM类型使用TINYINT来代替。 尽可能不使用TEXT、BLOB类型。 VARCHAR(N)N表示的是字符数不是字节数比如VARCHAR(255)可以最大可存储255个汉字需要根据实际的宽度来选择N。 VARCHAR(N)N尽可能小因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节进行排序和创建临时表一类的内存操作时会使用N的长度申请内存。 表字符集选择UTF8。 使用VARBINARY存储变长字符串。 存储年使用YEAR类型存储日期使用DATE类型存储时间精确到秒建议使用TIMESTAMP类型因为TIMESTAMP使用4字节DATETIME使用8个字节。 建议字段定义为NOT NULL。 将过大字段拆分到其他表中。 禁止在数据库中使用VARBINARY、BLOB存储图片、文件等。 索引 索引名称必须使用小写非唯一索引必须按照“idx_字段名称_字段名称[_字段名]”进行命名唯一索引必须按照“uniq_字段名称_字段名称[_字段名]”进行命名。 索引中的字段数建议不超过5个。 单张表的索引数量控制在5个以内。 唯一键由3个以下字段组成并且字段都是整形时使用唯一键作为主键。 没有唯一键或者唯一键不符合4中的条件时使用自增或者通过发号器获取id作为主键。 唯一键不和主键重复。 索引字段的顺序需要考虑字段值去重之后的个数个数多的放在前面。 ORDER BYGROUP BYDISTINCT的字段需要添加在索引的后面。 使用EXPLAIN判断SQL语句是否合理使用索引尽量避免extra列出现Using File SortUsingTemporary。 UPDATE、DELETE语句需要根据WHERE条件添加索引。 不建议使用%前缀模糊查询例如LIKE “%weibo”。 对长度过长的VARCHAR字段建立索引时添加crc32或者MD5 Hash字段对Hash字段建立索引。 合理创建联合索引避免冗余(a,b,c)相当于 (a) 、(a,b) 、(a,b,c)。 合理利用覆盖索引。 SQL变更需要确认索引是否需要变更并通知DBA。 SQL语句 SQL语句中IN包含的值不应过多。 UPDATE、DELETE语句不使用LIMIT。 WHERE条件中必须使用合适的类型避免MySQL进行隐式类型转化。 SELECT语句只获取需要的字段。 SELECT、INSERT语句必须显式的指明字段名称不使用SELECT *不使用INSERTINTO table。 使用SELECT column_name1, column_name2 FROM table WHERE[condition]而不是SELECT column_name1 FROM table WHERE[condition]和SELECT column_name2 FROM table WHERE [condition]。 WHERE条件中的非等值条件IN、BETWEEN、、、、会导致后面的条件使用不了索引。 避免在SQL语句进行数学运算或者函数运算容易将业务逻辑和DB耦合在一起。 INSERT语句使用batch提交INSERT INTO tableVALUES,,……values的个数不应过多。 避免使用存储过程、触发器、函数等容易将业务逻辑和DB耦合在一起并且MySQL的存储过程、触发器、函数中存在一定的bug。 避免使用JOIN。 使用合理的SQL语句减少与数据库的交互次数。 不使用ORDER BY RAND使用其他方法替换。 建议使用合理的分页方式以提高分页的效率。 统计表中记录数时使用COUNT(*)而不是COUNT(primary_key)和COUNT(1)。 禁止在从库上执行后台管理和统计类型功能的QUERY。 散表 每张表数据量建议控制在5000w以下。 可以结合使用hash、range、lookup table进行散表。 散表如果使用md5或者类似的hash算法进行散表表名后缀使用16进制比如user_ff。 推荐使用CRC32求余或者类似的算术算法进行散表表名后缀使用数字数字必须从0开始并等宽比如散100张表后缀从00-99。 使用时间散表表名后缀必须使用特定格式比如按日散表user_20110209、按月散表user_201102。
文:https://www.yidianzixun.com/article/0GJKj9Xz?title_sn/0s9appidxiaomiver3.9.6.0utk4lxc4q7c