赞
踩
1. 不应针对整个系统设计数据库的表,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计。不同组件间所对应的数据库表间的关
联应尽可能减少,如果不同组件间的表需要外键关联也尽量不要创建外键关联,而只是记录关联表的一个主键,确保组件对应的表之间的独立性,为系统或表结构 的
重构提供可能性。
2. 采用域模型驱动的方式和自顶向下的思路进行数据库设计,首先分析系统业务,根据职责定义对象。对象要符合封装的特性,确保与职责相关的数据项被定义在
一个 对象之内,这些数据项能够完整描述该职责,不会出现职责缺失,并且一个对象有且只有一项职责,如果一个对象要负责两个或以上的职责,应进行拆分。
3. 根据建立的领域模型可以数据库表的映射,此时应参考数据库设计第二范式:一个表的所有非关键值属性都依赖于整个关键字,关键字可以是一个属性,也可以是个
属的集合,不论哪种方式,都应确保关键字能够保证唯一性。在确定关键时,应保证关键字不会参与业务且不会出现更新异常,这时,最优解决方案为采用一个自数
值型属性或一个随机字符串作为表的关键字。
4. 由于第一点所述的领域模型驱动的方式设计数据库表的结构,领域模型中的每一个对象只有一项职责,所以对象中的数据项不存在传递依赖,所以,这种思路的数项
的数据库表结构设计从一开始即满足第三范式:一个表应满足第二范式,且属性间不存在依赖传递。
5. 同样,由于对象职责的单一性以及对象之间的关系的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N或N-N的角度进步
对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删除和插入异常。
6. 在映射后得出的数据库表结构中,应再根据第四范式进一步修改,确保不存在多值依赖。这时,就根据反向工程的思路反馈给领域模型,如果表结构中存在多值赖,
则证明领域模型中的对象具有至少两个以上的职责,应根据第一条进行设计修正。第四范式:一个表如果满足BCNF,不应存在多值依赖。
7. 在经过分析后确认所有的表都满足二,三,四范式的情况下,表和表之间的关联尽量采用弱关系以便于对表的字段和表的结构的调整和重构,并且,我认为数据库中
的表是用来持久化一个对象实例在特定时间及特定条件下的状态的,只是一个存储介质,所以,表和表这间不应采用强关联来表述业务(数据库的一至性)。这一职
责应由系统的逻辑层来保证,这种方式也确保了系统对于不正确的数据(脏数据)的兼容性。当然,从整个系统的角度来说我们还是尽最大的努力确保系统不会产
生脏数据,单从另一个角度来说,脏数据的产生在一定程度上也是不可避免的,我们也要保证系统对这种情况的容错性,这是一个折中的方案。
8. 应针对所有表的主键和外键建立索引,有针对性的(针对大数据量和常用的检索方式)建立组合属性的索引,提高检索性能。虽然建立索引会消耗部分系统资源,
但比较起来检索时搜索整张表中的数据尤其时 表的数据量较大时所带来的性能影响,以及无索引时的排序操作所带的性能影响,这种方式仍然是值得提倡的。
9. 尽量少用存储过程,目前已经有很多技术可以替代存储过程的功能和“对象/关系映射”等,将数据一致性的保证放在数据库中,无论对于版本控制,开发和部署,以及
数据库的迁移都会带来很大影响,但不否认,在储过程具有性能上的优势,所以,当系统可使用的硬件水平不会得到提升而性能又是非常重要的质量属性时,可经过
平衡考虑选用存储过程。
10. 当处理表间的关联约束所付出的代价(常常是使用性上的代价)超过了保证不会出现修改,删除,更新的异常所付出的代价,并且数据冗余也不是主要的问题,表
设计可以不符合第四范式,四个范式确保了不会出现异常,但也可能由此导致过于纯洁设计,便用表的结构难于使用,所以在设计时需要进行综合调整,但首先是
确保符合四个范式,然后再进行精化修正是刚刚进入数据库设计领域时可以采用最好方法。
11. 设计出的表要具有较好的使用性,主要体现在查询时是否需要关联多张表且还需使用复杂的SQL技巧。
12. 设计出的表要尽可能减少数据冗余,确保数据的准备性,有效的控制冗余有助于提高数据库性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。