需求分析 -> 逻辑设计 -> 物理设计-> 维护和优化
用户模块
用于记录用户的注册信息,包括用户名、密码、手机、邮箱、身份证号、地址、姓名、昵称等。
可选的唯一标识属性:用户名、身份证、电话。
存储特点:随着线上数据的增加,需要永久保存。
商品模块
用于记录网站中所销售的商品信息,包括商品的编码、商品名称、商品描述、商品类型、商品供应商名称、重量、有效期、价格等。
可选的唯一标识属性:商品名称-供应商名称、商品编码。
存储特点:对于下线商品可以存储归档。
订单模块
用于存储用户订购商品的信息,如订单号、用户姓名、手机、收货地址、商品编号、商品名称、数量、价格、订单状态、支付状态、订单类型等。
可选的唯一标识属性:订单号。
存储特点:永久存储(分库、分表存储)。
购物车模块
用于保存用户及用户购物时所选的商品,包括用户名、商品编号、商品名称、商品价格、商品描述、商品分类、商品数量等。
可选的唯一标识属性:用户名-商品编号-加入时间、购物车编号。
存储特点:不永久存储(设置归档、清理规则)。
供应商模块
用于保存所销售商品的供应商的信息,包括供应商编号、供应商名称、联系人、电话、营业执照、地址、法人等。
可选的唯一标识属性:供应商编号、营业执照号
存储特点:永久存储
选择合适的DBMS(Orcle、SQLServer、Mysql、PgSQL…)
定义数据库、表、字段、索引、视图、函数和触发器的命名规范
选择合适的字段类型(优先性:数字 > 日期或二进制 > 字符串,对于相同级别尽量使用占用空间小的类型)
反范式化设计(为了提高效率而适当保持库表数据的冗余)
选择主键:
区分业务主键和数据库主键
业务主键主要用于标识业务数据和进行表之间的关联,数据库主键为了优化数据存储,InnoDB会生成6个字节的隐含主键
根据数据库的类型考虑主键是否需要顺序增长
有些数据库是按照主键的顺序存储数据的
主键的字段类型所占的空间要尽可能的小
对于使用聚集索引式存储的表,每个索引之后都会附件主键信息
避免使用外键约束,以减少对物理外键的维护成本,和每次增查改查去检查是否符合外键约束的成本。
避免使用触发器。不同DBMS触发器的定义方式可能不同,这增加了系统的维护成本。
严禁使用预留字段(没啥意义)。
维护数据字典
select * from information_schema.tables where table_schema='test';
select * from information_schema.columns where table_schema='test' and table_name='user_03';
维护索引
通常需要对经常出现在 where、group by、order by子句中的字段建立索引以提高数据检索的效率。
维护表结构
在适当的时候对表进行垂直拆分和水平拆分
[注]
INF:库表的所有字段都是单一不可再分的,即第一范式要求数据库中的表都是二维表。
2NF:库表中不能存在非关键字段对任意候选关键字段(如唯一键或外键)的[部分]函数依赖,可以通过表拆分来设计。
3NF:库表中不能存在非关键字段对任意候选关键字段的[传递]函数依赖。同样可通过表拆分来符合3NF的要求。
BCNF:库表中不能存在[任何字段]对任意候选关键字段的[传递]函数依赖。同样可通过表拆分来符合3NF的要求。