美文网首页
数据库设计

数据库设计

作者: 春泥村雨 | 来源:发表于2018-08-12 18:30 被阅读14次

    1. 数据库选型

    1.1 常见 DBMS 系统:

    • 商业数据库(更适合企业级项目):Oracle、SQLServer

    • 开源数据库(适用于互联网项目):MySQL、PgSQL

    2. MySQL常用存储引擎:Innodb

    3. 数据库表及字段的命名规则

    • 可读性原则: 单词首字母大小写,MySQL 大小写敏感(设置)

    • 表意性原则

    • 长名原则: 少用缩写

    4. 字段类型的选择原则

    优先考虑数字类型,其次是日期或二进制类型,最后是字符类型,对于相同级别的数据类型,优先选择占用空间小的数据类型

    以上原则主要从下面两个角度考虑:

    1. 在对数据进行比较(查询条件、JOIN 条件及排序)操作时:同样的数据,字符处理往往比数字处理慢;
    2. 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升。

    4.1 char 与 varchar 选择原则?

    1. 长度一致用 char;
    2. 如果列中的最大数据长度小于 50 Byte,则一般也考虑用 char。(注:如果这个列很少用,则基于节省空间和减少 I/O 的考虑,还是可以选择用 varchar)
    3. 一般不宜定义大于 50 Byte 的 char 类型列,大于 50 Byte的选择 varchar 类型。
      utf8,每个字符占用 3 个字节

    4.2 decimal 与 float 选择原则?

    1. decimal 用于存储精确数据,float 只能用于存储非精确数据;
    2. float 的存储空间开销一般比 decimal 小(精确到 7 位小数需要 4 个字节,精确到 15 位小数需要 8 个字节)

    4.3 时间类型存储选择原则

    注:根据业务场景来进行选择,如果不经常被用于查询,可以选择 int

    1. 使用 int 来存储时间字段的优缺点

    优点:字段长度比 datetime 小

    缺点:使用时要进行函数转换,只能存储到 2038-1-19 11:14:07,即 2^32

    1. 需要存储的时间粒度:年 月 日 时 分 秒 周

    5. 如何选择主键

    1. 区分业务主键与数据库主键

    业务主键用于标识业务数据,进行表与表之间的关联;
    数据库主键为了优化数据存储(Innodb会生成6个字节的隐含主键)

    1. 根据数据库的类型,考虑主键是否要顺序增长

    有些数据库是按主键的顺序逻辑存储的

    1. 主键的字段类型所占空间要尽可能的小

    对于使用聚集索引方式存储的表,每个索引都会附加主键信息。

    6. 避免使用外键约束

    建议外键约束时,虽然可以保护数据的完整性,但数据写入时,会去检测是否符合外键约束,增加了开销。

    1. 降低数据导入的效率;
    2. 增加维护成本;
    3. 虽然不建议使用外键约束,但是相关联的列上一定要建立索引

    7. 避免使用触发器

    1. 降低数据导入的效率;
    2. 可能会出现意想不到的数据异常;
    3. 使业务逻辑变的复杂。

    8. 严禁使用预留字段

    1. 无法准确的知道预留字段的类型;
    2. 无法准确的知道预留字段中所存储的内容;
    3. 后期维护预留字段所要的成本,同增加一个字段所需要的成本是相同的。

    9. 反范式化

    为了性能和读取效率的考虑而适当对第三范式的要求进行违反,用空间换时间。

    10. 维护和优化

    10.1 维护数据字典

    1. 使用第三方工具对数据字典进行维护,根据数据库选择相应的数据库;
    select 
    a.table_name,b.TABLE_COMMENT,
    a.COLUMN_NAME,a.COLUMN_TYPE,a.COLUMN_COMMENT
    FROM
    information_schema.COLUMNS a JOIN information_schema.TABLES b
    ON a.table_schema=b.table_schema AND
    a.table_name=b.table_name
    WHERE a.table_name='customer'
    
    1. 利用数据库本身的备注字段来维护数据字典;

    2. 导出数据字典。

    10.2. 维护索引

    1. 出现在 Where 从名,group by 从名,order by 从句中的列;

    2. 可选择性高的列要放到索引的前面;

    3. 索引中不要包括太长的数据类型。

    注意事项

    1. 索引并不是越多越好,过多的索引会降低读写效率;

    2. 定期维护索引碎片;

    3. 在 SQL 语句中不要使用强制索引关键字。

    10.3 维护表结构

    1. 使用在线变更表结构的工具;
    2. 同时对数据字典进行维护;
    3. 控制表的宽度和大小。

    数据库适合的操作

    1. 批量操作 VS 逐条操作;
    2. 禁止使用 select * 这样的查询;
    3. 控制使用用户自定义函数;
    4. 不要使用数据库中的全文索引。

    10.4 在适当的时候对表进行水平拆分或垂直拆分

    垂直拆分:控制表的宽度

    1. 经常一起查询的列放到一起;
    2. text,blob 等大字段拆分出到附加表中。

    水平拆分:控制表的大小

    把一张表的数据拆分成多张表来存储。

    相关文章

      网友评论

          本文标题:数据库设计

          本文链接:https://www.haomeiwen.com/subject/yitebftx.html