Sql设计

2019-05-28 16:52:57

三范式

数据库设计三大范式 - Ruthless - 博客园

  1. 确保每列保持原子性(维度:单元格)
    所有字段都是不可分解的原子值。如【地址】这个属性,如果要经常用到【城市】这个部分,那么要将【地址】分解成【省份】、【城市】、【详细地址】等多个字段存储。
  2. 确保表中的每列都和主键有关(维度:一行)
    在第 1 条的基础上,确保数据库表中的每一列都和主键有关,而不是只与主键的某一部分相关(主要针对联合主键)。
    如子订单表中的【子订单 ID】和【商品 ID】构成联合主键。在这个表中,“商品名称,单位,商品价格”等信息不与该联合主键有关,而只是与【商品 ID】有关,不应该存储这些字段。
    如果需要这些字段,可以从商品表中获取
  3. 确保表中的每列都和主键列直接有关,而不是间接相关(维度:表)
    在一个表中存储了,在另一个表中存储外键就可以了,不要再重复添加其他字段。
    如在订单表中添加【客户 ID】即可,不要再添加客户名称、联系方式等(这些字段已经存在于客户表中)

范式是用来学习和参考的,设计的时候得具体问题具体对待。例如,在访问并发量大的情况下,也会采用反范式来设计提高数据库的响应能力。

浅谈 Mysql 表设计规范 - 刘小伟 - 博客园

用 BTree 还是 HASH

B+树索引和哈希索引的区别——我在想全文搜索引擎为啥不用 hash 索引而非得使用 B+呢? - bonelee - 博客园
MySQL BTree 索引和 hash 索引的区别 - ChangWen 的博客 - CSDN 博客

hash:hash 索引在 mysql 比较少用,他以把数据的索引以 hash 形式组织起来,因此当查找某一条记录的时候,速度非常快.
但是因为是 hash 结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.

B+树:b+tree 是 mysql 使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,
因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对 hash 索引,B+树在查找单条记录的速度虽然比不上 hash 索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.

1
2
3
1. 每列都为保持原子性(地址精确到省、城市)
2. 每列都和主键有关(主要针对复合主键)
3. 每列都和主键列直接相关

索引

Mysql 各种索引区别:
普通索引:最基本的索引,没有任何限制
唯一索引:与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高 mysql 效率可建立组合索引,遵循”最左前缀“原则。

分表处理的实现方法

1
2
3
4
5
6
-- 查找
SELECT * FROM `money_histories` WHERE user_id = 20022253
union all
SELECT * FROM `money_histories_201905` WHERE user_id = 20022253
union all
SELECT * FROM `money_histories_201906` WHERE user_id = 20022253