Sql设计
2019-05-28 16:52:57
三范式
- 确保每列保持原子性(维度:单元格)
所有字段都是不可分解的原子值。如【地址】这个属性,如果要经常用到【城市】这个部分,那么要将【地址】分解成【省份】、【城市】、【详细地址】等多个字段存储。 - 确保表中的每列都和主键有关(维度:一行)
在第 1 条的基础上,确保数据库表中的每一列都和主键有关,而不是只与主键的某一部分相关(主要针对联合主键)。
如子订单表中的【子订单 ID】和【商品 ID】构成联合主键。在这个表中,“商品名称,单位,商品价格”等信息不与该联合主键有关,而只是与【商品 ID】有关,不应该存储这些字段。
如果需要这些字段,可以从商品表中获取 - 确保表中的每列都和主键列直接有关,而不是间接相关(维度:表)
在一个表中存储了,在另一个表中存储外键就可以了,不要再重复添加其他字段。
如在订单表中添加【客户 ID】即可,不要再添加客户名称、联系方式等(这些字段已经存在于客户表中)
范式是用来学习和参考的,设计的时候得具体问题具体对待。例如,在访问并发量大的情况下,也会采用反范式来设计提高数据库的响应能力。
用 BTree 还是 HASH
B+树索引和哈希索引的区别——我在想全文搜索引擎为啥不用 hash 索引而非得使用 B+呢? - bonelee - 博客园
MySQL BTree 索引和 hash 索引的区别 - ChangWen 的博客 - CSDN 博客
hash:hash 索引在 mysql 比较少用,他以把数据的索引以 hash 形式组织起来,因此当查找某一条记录的时候,速度非常快.
但是因为是 hash 结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.
B+树:b+tree 是 mysql 使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,
因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对 hash 索引,B+树在查找单条记录的速度虽然比不上 hash 索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.
1 | 1. 每列都为保持原子性(地址精确到省、城市) |
索引
Mysql 各种索引区别:
普通索引:最基本的索引,没有任何限制
唯一索引:与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高 mysql 效率可建立组合索引,遵循”最左前缀“原则。
分表处理的实现方法
- MySQL 分表处理的实现方法(按月份分的表) - rongwenbin 的专栏 - CSDN 博客
- 数据量大的表的分表方案 以及 跨(同类型的)表查询遇上分组时需要注意的点 - Try My Best 尽力而为 - ITeye 博客
- MySQL 分库分表,写得太好了! - 51CTO.COM
1 | -- 查找 |