2023年7月27日发(作者:)
数据库表结构设计⽅法及原则在⽬前的企业信息系统中,数据库还是最佳的数据存储⽅式,虽然已经有很多的书籍在指导我们进⾏数据库设计,但应该那种⽅式是设计数据库的表结构的最好⽅ 法、设计时应遵从什么样的原则、四个范式如何能够⽤⼀种⽅式达到顺畅的应⽤等是我⼀直在思考和总结的问题,下⽂是我针对这⼏个问题根据⾃⼰的设计经历准备 总结的⼀篇⽂章的提纲,欢迎⼤家⼀块进⾏探讨,集思⼴益。其中提到了领域建模的概念,但未作详细解释,希望以后能够有时间我们针对这个命题进⾏深⼊探讨。
1) 不应该针对整个系统进⾏数据库设计,⽽应该根据系统架构中的组件划分,针对每个组件所处理的业务进⾏组件单元的数据库设计;不同组件间所对应的数据库表之 间的关联应尽可能减少,如果不同组件间的表需要外键关联也尽量不要创建外键关联,⽽只是记录关联表的⼀个主键,确保组件对应的表之间的独⽴性,为系统或表 结构的重构提供可能性。
2)采⽤领域模型驱动的⽅式和⾃顶向下的思路进⾏数据库设计,⾸先分析系统业务,根据职责定义对象。对象要符合封 装的特性,确保与职责相关的数据项被定义在⼀个对象之内,这些数据项能够完整描述该职责,不会出现职责描述缺失。并且⼀个对象有且只有⼀项职责,如果⼀个 对象要负责两个或两个以上的职责,应进⾏分拆。
3)根据建⽴的领域模型进⾏数据库表的映射,此时应参考数据库设计第⼆范式:⼀个表中的所 有⾮关键字属性都依赖于整个关键字。关键字可以是⼀个属性,也可以是多个属性的集合,不论那种⽅式,都应确保关键字能够保证唯⼀性。在确定关键字时,应保 证关键字不会参与业务且不会出现更新异常,这时,最优解决⽅案为采⽤⼀个⾃增数值型属性或⼀个随机字符串作为表的关键字。
4)由于第⼀点所述的领域模型驱动的⽅式设计数据库表结构,领域模型中的每⼀个对象只有⼀项职责,所以对象中的数据项不存在传递依赖,所以,这种思路的数据库表结构设计从⼀开始即满⾜第三范式:⼀个表应满⾜第⼆范式,且属性间不存在传递依赖。
5)同样,由于对象职责的单⼀性以及对象之间的关系反映的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N 或N-N的⾓度进⼀步主对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删除和插⼊异常。
6) 在映射后得出的数据库表结构中,应再根据第四范式进⾏进⼀步修改,确保不存在多值依赖。这时,应根据反向⼯程的思路反馈给领域模型。如果表结构中存在多值 依赖,则证明领域模型中的对象具有⾄少两个以上的职责,应根据第⼀条进⾏设计修正。第四范式:⼀个表如果满⾜BCNF,不应存在多值依赖。
7) 在经过分析后确认所有的表都满⾜⼆、三、四范式的情况下,表和表之间的关联尽量采⽤弱关联以便于对表字段和表结构的调整和重构。并且,我认为数据库中的表 是⽤来持久化⼀个对象实例在特定时间及特定条件下的状态的,只是⼀个存储介质,所以,表和表之间也不应⽤强关联来表述业务(数据间的⼀致性),这⼀职责应 由系统的逻辑层来保证,这种⽅式也确保了系统对于不正确数据(脏数据)的兼容性。当然,从整个系统的⾓度来说我们还是要尽最⼤努⼒确保系统不会产⽣脏数 据,单从另⼀个⾓度来说,脏数据的产⽣在⼀定程度上也是不可避免的,我们也要保证系统对这种情况的容错性。这是⼀个折中的⽅案。
8)应针 对所有表的主键和外键建⽴索引,有针对性的(针对⼀些⼤数据量和常⽤检索⽅式)建⽴组合属性的索引,提⾼检索效率。虽然建⽴索引会消耗部分系统资源,但⽐ 较起在检索时搜索整张表中的数据尤其时表中的数据量较⼤时所带来的性能影响,以及⽆索引时的排序操作所带来的性能影响,这种⽅式仍然是值得提倡的。
9) 尽量少采⽤存储过程,⽬前已经有很多技术可以替代存储过程的功能如“对象/关系映射”等,将数据⼀致性的保证放在数据库中,⽆论对于版本控制、开发和部 署、以及数据库的迁移都会带来很⼤的影响。但不可否认,存储过程具有性能上的优势,所以,当系统可使⽤的硬件不会得到提升⽽性能⼜是⾮常重要的质量属性 时,可经过平衡考虑选⽤存储过程。
10)当处理表间的关联约束所付出的代价(常常是使⽤性上的代价)超过了保证不会出现修改、删除、更改 异常所付出的代价,并且数据冗余也不是主要的问题时,表设计可以不符合四个范式。四个范式确保了不会出现异常,但也可能由此导致过于纯洁的设计,使得表结 构难于使⽤,所以在设计时需要进⾏综合判断,但⾸先确保符合四个范式,然后再进⾏精化修正是刚刚进⼊数据库设计领域时可以采⽤的最好办法。
11)设计出的表要具有较好的使⽤性,主要体现在查询时是否需要关联多张表且还需使⽤复杂的SQL技巧。
12)设计出的表要尽可能减少数据冗余,确保数据的准确性,有效的控制冗余有助于提⾼数据库的性能。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690429406a348706.html
评论列表(0条)