11 个重要的数据库设计规则

简介:在您开始阅读这篇文章以前,我得明确地告诉您,我并非一个数据库设计领域的大师。如下列出的 11 点是我对本身在平时项目实践和阅读中学习到的经验总结出来的我的看法。我我的认为它们对个人数据库设计提供了很大的帮助。实属一家之言,欢迎拍砖 : ) es6

我之因此写下这篇这么完整的文章是由于,不少开发者一参与到数据库设计,就会很天然地把 “三范式” 看成银弹同样来使用。他们每每认为遵循这个规范就是数据库设计的惟一标准。因为这种心态,他们每每尽管一路碰壁也会坚持把项目作下去。 数据库

你们都说标准规范是重要的指导方针而且也这么作着,可是把它看成石头上的一块标记来记着(死记硬背)仍是会带来麻烦的。如下 11 点是我在数据库设计时最优先考虑的规则。 数据库设计

11 个重要的数据库设计规则

规则 1:弄清楚将要开发的应用程序是什么性质的(OLTP 仍是 OPAP)? 函数

当你要开始设计一个数据库的时候,你应该首先要分析出你为之设计的应用程序是什么类型的,它是 “事务处理型”(Transactional) 的仍是 “分析型” (Analytical)的?你会发现许多开发人员采用标准化作法去设计数据库,而不考虑目标程序是什么类型的,这样作出来的程序很快就会陷入性能、客户定制化的问题当中。正如前面所说的,这里有两种应用程序类型, “基于事务处理” 和 “基于分析”,下面让咱们来了解一下这两种类型究竟说的是什么意思。 性能

事务处理型:这种类型的应用程序,你的最终用户更关注数据的增查改删(CRUD,Creating/Reading/Updating/Deleting)。这种类型更加官方的叫法是 “OLTP” 。 学习

分析型:这种类型的应用程序,你的最终用户更关注数据分析、报表、趋势预测等等功能。这一类的数据库的 “插入” 和 “更新” 操做相对来讲是比较少的。它们主要的目的是更加快速地查询、分析数据。这种类型更加官方的叫法是 “OLAP” 。 优化

11 个重要的数据库设计规则

那么换句话说,若是你认为插入、更新、删除数据这些操做在你的程序中更为突出的话,那就设计一个规范化的表不然的话就去建立一个扁平的、不规范化的数据库结构。 es5

如下这个简单的图表显示了像左边 Names 和 Address 这样的简单规范化的表,怎么经过应用不规范化结构来建立一个扁平的表结构。 spa

11 个重要的数据库设计规则

 

规则 2:将你的数据按照逻辑意义分红不一样的块,让事情作起来更简单 设计

这个规则其实就是 “三范式” 中的第一范式。违反这条规则的一个标志就是,你的查询使用了不少字符串解析函数

例如 substring、charindex 等等。若真如此,那就须要应用这条规则了。

好比你看到的下面图片上有一个有学生名字的表,若是你想要查询学生名字中包含“Koirala”,但不包含“Harisingh”的记录,你能够想象一下你将会获得什么样的结果。

因此更好的作法是将这个字段拆分为更深层次的逻辑分块,以便咱们的表数据写起来更干净,以及优化查询。

11 个重要的数据库设计规则

规则 3:不要过分使用 “规则 2”

开发者都是一群很可爱的生物。若是你告诉他们这是一条解决问题的正路,他们就会一直这么作下去,作到过了头致使了一些没必要要的后果。这也能够应用于咱们刚刚在前面提到的规则2。当你考虑字段分解时,先暂停一下,而且问问你本身是否真的须要这么作。正如所说的,分解应该是要符合逻辑的。

例如,你能够看到电话号码这个字段,你不多会把电话号码的 ISD 代码单独分开来操做(除非你的应用程序要求这么作)。因此一个很明智的决定就是让它保持原样,不然这会带来更多的问题。

11 个重要的数据库设计规则

规则 4:把重复、不统一的数据当成你最大的敌人来对待

集中那些重复的数据而后重构它们。我我的更加担忧的是这些重复数据带来的混乱而不是它们占用了多少磁盘空间。

例以下面这个图表,你能够看到 “5th Standard” 和 “Fifth standard” 是同样的意思,它们是重复数据。如今你可能会说是因为那些录入者录入了这些重复的数据或者是差劲的验证程序没有拦住,让这些重复的数据进入到了你的系统。如今,若是你想导出一份将本来在用户眼里十分困惑的数据显示为不一样实体数据的报告,该怎么作呢?

11 个重要的数据库设计规则

解决方法之一是将这些数据完整地移到另一个主表,而后经过外键引用过来。在下面这个图表中你能够看到咱们是如何建立一个名为 “Standards”(课程级别) 的主表,而后一样地使用简单的外键链接过去。

11 个重要的数据库设计规则

规则 5:小心被分隔符分割的数据,它们违反了“字段不可再分”

前面的规则 2 即“第一范式”说的是避免 “重复组” 。下面这个图表做为其中的一个例子解释了 “重复组”是什么样子的。若是你仔细的观察 syllabus(课程) 这个字段,会发如今这一个字段里实在是填充了太多的数据了。像这些字段就被称为 “重复组” 了。若是咱们又得必须使用这些数据,那么这些查询将会十分复杂而且我也怀疑这些查询会有性能问题。

11 个重要的数据库设计规则

这些被塞满了分隔符的数据列须要特别注意,而且一个较好的办法是将这些字段移到另一个表中,使用外键链接过去,一样地以便于更好的管理。

11 个重要的数据库设计规则

 

那么,让咱们如今就应用规则2(第一范式) “避免重复组” 吧。你能够看到上面这个图表,我建立了一个单独的 syllabus(课程) 表,而后使用 “多对多” 关系将它与 subject(科目) 表关联起来。

经过这个方法,主表(student 表)的 syllabus(课程) 字段就再也不有重复数据和分隔符了。

规则 6:小心那些仅仅部分依赖主键的列

11 个重要的数据库设计规则

 

留心注意那些仅仅部分依赖主键的列。例如上面这个图表,咱们能够看到这个表的主键是 Roll No.+Standard。如今请仔细观察 syllabus 字段,能够看到 syllabus(课程) 字段仅仅关联(依赖) Standard(课程级别) 字段而不是直接地关联(依赖)某个学生(Roll No. 字段)。

Syllabus(课程) 字段关联的是学生正在学习的哪一个课程级别(Standard 字段)而不是直接关联到学生自己。那若是明天咱们要更新教学大纲(课程)的话还要痛苦地为每一个同窗也修改一下,这明显是不符合逻辑的(不正常的作法)。更有意义的作法是将这些字段从这个表移到另一个表,而后将它们与 Standard(课程级别)表关联起来。

你能够看到咱们是如何移动 syllabus(课程)字段而且一样地附上 Standard 表。

这条规则只不过是 “三范式” 里的 “第二范式”:“全部字段都必须完整地依赖主键而不是部分依赖”。

规则 7:仔细地选择派生列

11 个重要的数据库设计规则

若是你正在开发一个 OLTP 型的应用程序,那强制不去使用派生字段会是一个很好的思路,除非有迫切的性能要求,好比常常须要求和、计算的 OLAP 程序,为了性能,这些派生字段就有必要存在了。

经过上面的这个图表,你能够看到 Average 字段是如何依赖 Marks 和 Subjects 字段的。这也是冗余的一种形式。所以对于这样的由其余字段获得的字段,须要思考一下它们是否真的有必要存在。

这个规则也被称为 “三范式” 里的第三条:“不该该有依赖于非主键的列” 。 个人我的见解是不要盲目地运用这条规则,应该要看实际状况,冗余数据并不老是坏的。若是冗余数据是计算出来的,看看实际状况再来决定是否应用这第三范式。

规则 8:若是性能是关键,不要执拗地去避免冗余

11 个重要的数据库设计规则

不要把 “避免冗余” 看成是一条绝对的规则去遵循。若是对性能有迫切的需求,考虑一下打破常规。常规状况下你须要作多个表的链接操做,而在很是规的状况下这样的多表链接是会大大地下降性能的。

规则 9:多维数据是各类不一样数据的聚合

OLAP 项目主要是解决多维数据问题。好比你能够看看下面这个图表,你会想拿到每一个国家、每一个顾客、每段时期的销售额状况。简单的说你正在看的销售额数据包含了三个维度的交叉。

11 个重要的数据库设计规则

为这种状况作一个实际的设计是一个更好的办法。简单的说,你能够建立一个简单的主要销售表,它包含了销售额字段,经过外键将其余全部不一样维度的表链接起来。

11 个重要的数据库设计规则

11 个重要的数据库设计规则

 

规则 10:将那些具备“名值表”特色的表统一块儿来设计

不少次我都遇到过这种 “名值表” 。 “名值表” 意味着它有一些键,这些键被其余数据关联着。好比下面这个图表,你能够看到咱们有 Currency(货币型)和 Country(国家)这两张表。若是你仔细观察你会发现实际上这些表都只有键和值。

11 个重要的数据库设计规则

 

对于这种表,建立一个主要的表,经过一个 Type(类型)字段来区分不一样的数据将会更有意义。

规则 11:无限分级结构的数据,引用本身的主键做为外键

咱们会常常碰到一些无限父子分级结构的数据(树形结构?)。例如考虑一个多级销售方案的状况,一个销售人员之下能够有多个销售人员。注意到都是 “销售人员” 。也就是说数据自己都是一种。可是层级不一样。这时候咱们能够引用本身的主键做为外键来表达这种层级关系,从而达成目的。

11 个重要的数据库设计规则

这篇文章的用意不是叫你们不要遵循范式,而是叫你们不要盲目地遵循范式。根据你的项目性质和须要处理的数据类型来作出正确的选择。

11 个重要的数据库设计规则

相关文章
相关标签/搜索