阅读更多

31顶
1踩

数据库

转载新闻 11 条重要的数据库设计规则

2012-04-13 09:38 by 正式编辑 nemohq 评论(12) 有13261人浏览
在你开始阅读这篇文章之前,我(指原文作者)得明确地告诉你,我并不是一个数据库设计领域的大师。以下列出的11点是我从自己在平时项目实践和阅读中学习到的经验总结出来的个人见解。我个人认为它们对我的数据库设计提供了很大的帮助。


我之所以写下这篇长文是因为,很多开发者一参与到数据库设计,就会很自然地把“三范式”当作银弹一样来使用。他们往往认为遵循这个规范就是数据库设计的唯一标准。由于这种心态,他们往往尽管一路碰壁也会坚持把项目做下去。

如果你对 “三范式” 不清楚,请点击这里一步一步的了解什么是“三范式”。

大家都说标准规范是重要的指导方针,并且也都这么做,但是死记硬背还是会带来麻烦的。以下11点是我在数据库设计时会优先考虑的规则。

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

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

  • 事务处理型:对于这种类型的应用程序,你的用户更关注数据的增查改删(CRUD,Creating/Reading/Updating/Deleting)。这种类型官方称之为 “OLTP”。
  • 分析型:对于这种类型的应用程序,你的用户更关注数据分析、报表、趋势预测等功能。这一类的数据库的“插入” 和“更新”操作相对来说是比较少的。用户的主要目的是更加快速地查询、分析数据。这种类型官方称之为 “OLAP”。

那么换句话说,如果你认为插入、更新、删除数据这些操作在你的程序中更为突出的话,那就设计一个规范化的表,否则的话就去创建一个扁平的、不规范化的数据库结构

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


规则2:将你的数据按照逻辑意义分成不同的块,让事情做起来更简单

这个规则其实就是 “三范式”中的第一范式。违反这条规则的一个标志就是:你的查询使用了很多字符串解析函数,例如 substring、charindex 等等。若真如此,那就需要应用这条规则了。

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

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


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

开发者都是一个很可爱的群体。如果你告诉他们这是一条解决问题的正路,他们就会一直这么做下去,做到过了头导致产生一些不必要的后果。这也可以应用于我们刚刚在前面提到的规则2。当你考虑字段分解时,先暂停一下,并且问问你自己是否真的需要这么做。正如前面所说的,分解应该是要符合逻辑的。

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


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

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

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


解决方法之一是将这些数据完整地移到另外一个主表,然后通过外键引用过来。在下面这个图表中你可以看到我们是如何创建一个名为Standards 的主表,然后同样地使用简单的外键连接过去。


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

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


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


那么,让我们现在就应用规则2(第一范式)“避免重复组” 吧。你可以看到上面这个图表,我创建了一个单独的 Syllabus表,然后使用“多对多” 关系将它与 Subject表关联起来。

通过这个方法,主表(Student 表)的 Syllabus字段就不再有重复数据和分隔符了。

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


留心注意那些仅仅部分依赖主键的列。例如上面这个图表,我们可以看到这个表的主键是 Roll No.+Standard。现在请仔细观察 Syllabus 字段,可以看到 Syllabus字段仅仅关联Standard字段而不是直接地关联某个学生Roll No.字段。

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

你可以看到我们是如何移动 Syllabus 字段并且同样地附上 Standard 表。

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

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


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

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

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

规则8:如果性能是关键,不要固执地去避免冗余


不要把“避免冗余”当作是一条绝对的规则去遵循。如果对性能有迫切的需求,考虑一下打破常规。常规情况下你需要做多个表的连接操作,而在非常规的情况下这样的多表连接是会大大地降低性能的。

规则9:多维数据是各种不同数据的聚合

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


为这种情况做一个实际的设计是一个更好的办法。简单的说,你可以创建一个简单的主要销售表,它包含了销售额字段,通过外键将其他所有不同维度的表连接起来。



规则10:将那些键/值表统一起来设计

很多次我都遇到过这种键/值表。键/值表意味着它有一些键,这些键被其他数据关联着。比如下面这个图表,你可以看到我们有 Currency和 Country这两张表。如果你仔细观察你会发现实际上这些表都只有键和值。


对于这种表,创建一个主要的表,通过一个 Type字段来区分不同的数据将会更有意义。

规则11:无限分级结构的数据,引用自己的主键作为外键

我们会经常碰到一些无限分级结构的数据。例如考虑一个多级销售方案的情况,一个销售人员之下可以有多个销售人员。注意到都是“销售人员”。也就是说数据本身就是一个层级。但是层级不同。这时候我们可以引用自己的主键作为外键来表达这种层级关系,从而达成目的。


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


英文原文:11 Important Database designing rules

  • 大小: 25.7 KB
  • 大小: 13.1 KB
  • 大小: 30.5 KB
  • 大小: 37.2 KB
  • 大小: 31.3 KB
  • 大小: 53.8 KB
  • 大小: 39.3 KB
  • 大小: 46.9 KB
  • 大小: 43.1 KB
  • 大小: 43.8 KB
  • 大小: 37.9 KB
  • 大小: 30.5 KB
  • 大小: 50.4 KB
  • 大小: 24.3 KB
  • 大小: 13.3 KB
  • 大小: 27.5 KB
  • 大小: 15.9 KB
  • 大小: 29.6 KB
31
1
评论 共 12 条 请登录后发表评论
12 楼 fish2007 2012-04-15 22:50
learn from you
11 楼 forever8tf 2012-04-15 10:12
“如果你对 “三范式” 不清楚,请点击这里一步一步的了解什么是“三范式”。”
视频里是印度人,印度英语好难懂啊~
10 楼 whxiyi100829 2012-04-15 09:18
很好,学习了
9 楼 lysvanilla 2012-04-14 12:37
谢谢 不错
8 楼 longwenbin2008 2012-04-14 12:14
很不错的总结,学习
7 楼 lonelybug 2012-04-14 09:30
数据库设计本来是应该在业务领域设计之后的事情,并且,数据库设计为驱动导向的设计项目必然最后会走到业务逻辑难以维护,数百个标单之间各种的引用连接。
6 楼 Alrale 2012-04-13 22:14
总结的非常好,之前我也在数据库的设计上经常疑惑,也曾固执的认为不应该冗余,
后来慢慢体会到适用场景下冗余到来的方便。理论还得结合实际。
5 楼 hiblue 2012-04-13 18:55
有几句没看懂说的是什么?
4 楼 s929498110 2012-04-13 17:08
very good   
3 楼 ximenchuifeng 2012-04-13 13:38
非常不错!
2 楼 phrmgb 2012-04-13 13:35
学习了,谢谢
1 楼 zqding 2012-04-13 13:29
写的很好,学习了  

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 11条重要的数据库设计规则

    11条重要的数据库设计规则,做设计的朋友可以参考参考,经验总结啊。

  • 数据库系统课程设计(高校成绩管理数据库系统的设计与实现)

    数据库课程设计

  • 数据库课程设计(饭店点餐系统)

    2.概念结构设计 2.1 数据需求 2.1.1下订单阶段需要的数据: 2.1.2点菜阶段需要的数据: 2.1.3结账阶段需要的数据: 2.1.4员工管理需要的数据: 2.1.5顾客管理需要的数据: 2.1.6消费记录管理需要的数据有: ...

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

     在您开始阅读这篇文章之前,我得明确地告诉您,我并不是一个数据库设计领域的大师。以下列出的 11 点是我对自己在平时项目实践和阅读中学习到的经验总结出来的个人见解。我个人认为它们对我的数据库设计提供了很大...

  • 数据库设计5-逻辑结构设计

    三、关系模式规范化1、概念2、范式四、模式的评价与改进 逻辑结构设计是将概念结构设计阶段完成的概念模型,转换成能被选定的数据库管理系统(DBMS)支持的数据模型。这里主要将E-R模型转换为关系模式。需要具体说明把...

  • 数据库设计(三)——数据库设计规范

    一、数据库设计规范简介 1、数据库设计规范化的要求 A、表中应该避免可为空的列 B、表不应该有重复的值或者列 C、表中记录应该有一个唯一的标识符 D、数据库对象要有统一的前缀名 E、尽量只存储单一实体类型的数据...

  • 数据库架构设计——分布式数据库设计

    更重要的是,分布式数据库中的表,要能选出一个统一的分片键,即大部分表都能根据这个分片键打散数据,这样当后续业务进行访问数据时,可以在一个分片中完成单元化的闭环操作,不用涉及跨分片的访问。

  • 数据库设计(一)——数据库设计

    一、数据库设计简介 按照规范设计,将数据库 的设计过程分为六个阶段: A、系统 需求分析阶段 B、概念结构设计阶段 C、逻辑结构设计阶段 D、物理结构设计阶段 E、数据库实施阶段 F、数据库运行与维护阶段 需求分析...

  • 数据库课程设计 ——酒店管理系统

    (3) 数据库模式的定义 根据上述关系模式和转换原则,可得到数据库模式和用户子模式。为了方便理解和使用,表明和列名采用驼峰命名法,数据库的模式如表1-3~~表1-9所示,用户子模式如表1-10~1-14表所示。 表1-3 房间...

  • 数据库设计流程

    本文主要介绍了数据库设计中的E-R模型以及如何将E-R图转换为关系模式

  • 4.2 图书借阅系统数据库设计 --MySQL

    大家好,我是天罡gg,一个有十多年丰富经验的高级架构师,参与过很多系统的数据库设计,在数据库设计方面有相当丰富的经验。正赶上这篇实战专栏的数据库设计,所以今天让我们来一起做一下《图书借阅系统的数据库设计...

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

    很好的一篇思考数据库设计的文章,有些规则在日常设计中有意无意的在违背,从而导致设计出不良的程序。转载,保存,并提醒自己,要做好数据库的设计。 总结: 规则 1:弄清楚将要开发的应用程序是什么性质的...

  • 高校学籍管理系统(SQL Server数据库课程设计)

    而对学生的学籍管理工作更是高校管理工作的一个重要环节。 面对高校学生学籍信息如此庞大的数据群,如采用传统的管理模式,管理工作的效率不仅低下,而且数据错误的发生率相对较高,还会产生人力和物力上的巨大开支...

  • 数据库:数据库设计(需求,设计,运行,维护)

    1,数据库设计概述 1.1,数据库设计的基本概念 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种...

  • 数据库课程设计

    第2章 数据库设计 2.1 需求分析 2.2 概念结构设计 2.3 逻辑结构设计 2.4关系模式规范化检查及处理 第3章 数据库定义与操作 3.1 数据库及数据表定义 3.2 数据查询操作 3.3 数据增删改操作 3.4 索引及视图...

  • 11个重要的数据库设计原则

    英文原文: ... 在您开始阅读这篇文章之前,我得明确地告诉您,我并不是一个数据库设计领域的大师。以下列出的 11 点是我对自己在平时项目实践和阅读中学习到的经验总结出来的个人见解。我个人认为它们

  • 数据库设计原则

    一,数据库设计原则 1. 原始单据与实体之间的关系  可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。 在特殊情况下,它们可能是一对多或多对一的...

  • 数据库设计案例

    数据库概念模型设计 需要完成的操作(可以参考原博主 LLLLQZ 的 数据库设计步骤(超级详细)|数据库LLLLQZ) (1)对以上描述进行分析,进行数据库概念模型的设计(即确定各个实体、属性及联系并绘制E-R图)。...

  • 数据库设计的重要性

    一、设计数据库的必要性...良好的数据库设计: 节省数据的存储空间 能够保证数据的完整性 方便进行数据库应用系统的开 糟糕的数据库设计: 数据冗余、存储空间浪费 数据更新和插入的异常 ...

  • 数据库设计

    数据库设计 数据库设计概念 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构, 并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括...

Global site tag (gtag.js) - Google Analytics