SQLcode数据库表结构设计方法及原则、四个范式的原则

[Quote=引用8楼fredrickhu的回复:]

SQLcode数据库表结构设计方式及原则

在目前的企业信息系统中,数据库还是最佳的数据储存方法,尽管早已有好多的书籍在指导我们进行数据库设计,但应当那个方法是设计数据库的表结构的最好方式、设计时应遵照哪些样的原则、四个范式怎样才能用一种方法达到顺畅的应用等是我仍然在思索和总结的问题,下文是我针对这几个问题依照自己的设计经历打算总结的一篇文章的提纲,欢迎你们一块进行阐述,集思广益。其中提及了领域建模的概念数据库的可扩展性,但未作详尽解释,希望之后才能有时间我们针对这个命题进行深入剖析。1)不应当针对整个系统进行数据库设计,而应当按照系统构架中的组件界定,针对每位组件所处理的业务进行组件单元的数据库设计;不同组件间所对应的数据库表之间的关联应尽可能降低,假若不同组件间的表须要字段关联也尽量不要创建字段关联,而只是记录关联表的一个字段,确保组件对应的表之间的独立性,为系统或表结构的构建提供可能性。2)采用领域模型驱动的形式和自顶向上的思路进行数据库设计,首先剖析系统业务,按照职责定义对象。对象要符合封装的特点,确保与职责相关的数据项被定义在一个对象之内,这种数据项才能完整描述该职责,不会出现职责描述缺位。而且一个对象有且只有一项职责,假如一个对象要负责两个或两个以上的职责,应进行拆分。

3)依据构建的领域模型进行数据库表的映射,此时应参考数据库设计第二范式:一个表中的所有非关键字属性都依赖于整个关键字。关键字可以是一个属性数据库的可扩展性,也可以是多个属性的集合,不论那个方法,都应确保关键字才能保证惟一性。在确定关键字时,应保证关键字不会参与业务且不会出现更新异常,这时,最优解决方案为采用一个自增数值型属性或一个随机字符串作为表的关键字。4)因为第一点所述的领域模型驱动的形式设计数据库表结构,领域模型中的每一个对象只有一项职责,所以对象中的数据项不存在传递依赖,所以,这些思路的数据库表结构设计从一开始即满足第三范式:一个表应满足第二范式,且属性间不存在传递依赖。5)同样,因为对象职责的单一性以及对象之间的关系反映的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N或N-N的角度进一步主对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删掉和插入异常。6)在映射后得出的数据库表结构中,应再按照第四范式进行进一步更改,确保不存在多值依赖。这时,应按照反向工程的思路反馈给领域模型。假如表结构中存在多值依赖,则证明领域模型中的对象具有起码两个以上的职责,应按照第一条进行设计修正。

第四范式:一个表假如满足BCNF,不应存在多值依赖。7)在经过剖析后确认所有的表都满足二、三、四范式的情况下,表和表之间的关联尽量采用弱关联以易于对表数组和表结构的调整和构建。而且,我觉得数据库中的表是拿来持久化一个对象实例在特定时间及特定条件下的状态的,只是一个储存介质,所以,表和表之间也不应用强关联来叙述业务(数据间的一致性),这一职责应由系统的逻辑层来保证,这些方法也确保了系统对于不正确数据(脏数据)的兼容性。其实,从整个系统的角度来说我们还是要尽最大努力确保系统不会形成脏数据,单从另一个角度来说,脏数据的形成在一定程度上也是不可防止的,我们也要保证系统对这些情况的容错性。这是一个折中的方案。8)应针对所有表的字段和字段构建索引,有针对性的(针对一些大数据量和常用检索方法)构建组合属性的索引,提升检索效率。其实构建索引会消耗部份系统资源,但比较起在检索时搜索整张表中的数据尤其时表中的数据量较大时所带来的性能影响,以及无索引时的排序操作所带来的性能影响,这些方法依然是值得倡导的。9)尽量少采用储存过程,目前早已有好多技术可以取代储存过程的功能如“对象/关系映射”等,将数据一致性的保证置于数据库中,无论对于版本控制、开发和布署、以及数据库的迁移就会带来很大的影响。

图片[1]-SQLcode数据库表结构设计方法及原则、四个范式的原则-唐朝资源网

但不可证实,储存过程具有性能上的优势,所以,当系统可使用的硬件不会得到提高而性能又是十分重要的质量属性时,可经过平衡考虑选用储存过程。10)当处理表间的关联约束所付出的代价(往往是使用性上的代价)超过了保证不会出现更改、删除、更改异常所付出的代价,而且数据冗余也不是主要的问题时,表设计可以不符合四个范式。四个范式确保了不会出现异常,但也可能由此造成过分纯洁的设计,致使表结构难于使用,所以在设计时须要进行综合判定,但首先确保符合四个范式,之后再进行精化修正是刚才步入数据库设计领域时可以采用的最好办法。11)设计出的表要具有较好的使用性,主要彰显在查询时是否须要关联多张表且还需使用复杂的SQL方法。12)设计出的表要尽可能降低数据冗余,确保数据的确切性,有效的控制冗余有助于提升数据库的性能。

[/Quote]

不错,是个人心得?真的挺不错,我总结不那么有条理,但上面有些不同见解,储存过程是必须的,事实上储存过程不验证数据有效性,而是执行复杂的逻辑,这种放到程序上面是不合适的。

© 版权声明
THE END
喜欢就支持一下吧
点赞262 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片