范式
设计数据库时必然会关注的原则,本文不再进行说明,简要概括为行唯一、列唯一、主键关联。
数据分类
数据分为静态数据和动态数据。静态数据是相对固定不变的,或者说变化不太频繁,且变化之后往往采用覆盖的方式,如姓名、出生日期、性别等;动态数据则是持续增加的,并且增加时往往采用叠加的方式,并不覆盖原来的数据,如销售数据、学历信息等。
原则上,一个好的数据结构需要将静态数据和动态数据分开记录,通过关联表将两者关联形成一个完整的相互关联的数据库。如, 学生基本信息(静态)和学生成绩信息(动态)分开存储,通过学号(关联字段)进行关联。
(直观意义上来讲,静动分离最明显的优势是减少冗余存储,如过学生信息和学生成绩存在一张表中,则新增一条学生成绩即写入一次学生信息)
数据粒度
最容易忽视但在实际设计过程中会无意识完成的一部分工作。以时间维度为例,商场营业额以天为单位入库,一个商场的销售额一天一条记录,则数据在时间维度上的粒度为天。在数据仓库中设计时会要求尽可能保持原子粒度(原子粒度的数据具有最大的拓展性,但需要巨大的存储空间,同时大量的数据会带来查询延时);常用的一些系统在设计关系数据库时会根据业务需求自定数据粒度。
从数据的长期维护和可用性角度上,在设计数据结构时,相互关联的数据表的粒度应尽可能保持一致。
数据关联
在针对表设计时尽可能减少外键关联的创建,可以只记录关联表的一个主键或建立关联表。这样做可以确保表之间的独立性,为系统或表结构重构提供可能性。
其实,在实际应用中我们应该尽可能的减少数据表之间的关联,第一关联对于数据库重构是一大阻碍,第二关联使得数据关系更为复杂,查询性能较低。因此,在实际系统开发中常常通过增加冗余来减少关联。
(关联关系较多的设计当属数据仓库设计了,因为数据仓库设计过程中以原子粒度为标准、仅能写入无法进行数据删除、更改;这就导致事实表中数据量巨大,为了不影响数据存储查询只能将一些维度信息以主键字段关联。)
存储过程
存储过程虽然用起来特别方便,但目前主流数据库软件中没有一个具有支持存储过程逻辑关系、依赖关系追溯的功能,时间一长,往往没有人能记住或了解存储过程的使用场景、逻辑关系、存储过程之间的依赖关系(这将意味着数据库维护人员需要从头做起数据结构设计时的部分工作);同时,存储过程对于数据库重构也是一大阻碍。
结语
本文属于一篇纯文本式分享,所述仅属于个人理解,欢迎指正!
网友评论