数据库devise的最佳实践

我非常熟悉SQL Server,MySQL,Oracle等,但把这些数据库产品放在一边,有没有资源可以帮助我devise好关系数据库? 有没有像数据库devise模式或最佳做法?

我曾经看过几次数据库往往不可扩展; 人们有个人喜好保持像isChecked列这是本质上布尔值,但存储为Char(1)与价值如“Y”和“N”,而不是0和1这对我来说听起来更好。 在进行数据库devise时不要犯一些常见的错误?

链接到书籍或文章将不胜感激。

提前致谢。

几点:

  • 尽可能多地了解问题域 。 不知道你正在devise什么,你不能创build好的数据模型
  • 对数据库提供者提供的数据types有很好的了解
  • 如何正确使用规范化和devise表
  • 性能:何时以及如何应用索引 ,如何编写高效的查询
  • 何时以及如何使用不同的数据库对象,如视图,过程,函数,触发器

有许多数据库devise模式。 它们通常不是很好的forms化,所以你可能只需要看看很多的数据库devise。

例如,参见福勒关于devise模式的书籍 。 也Nock的书 。

有博客,像数据库程序员 。

有一本IEEE书籍, 基于模式的数据库devise和实现 。

Googlesearch( 链接 )的点击量达到2400万。

我对此的看法有点逆转。 我build议,不要过分强调数据库的devise。

有时候这可能很难。 对于内部的LOB应用程序来说,业务stream行的观点往往是DATA是主要资产,因为软件是可以消耗的。

我的build议是:不要买它。

实际上,资产是公司与数据交互的能力。 要查看它,操纵它,并根据它做出决定。

这意味着即使他们可能对数据有很高的价值,但他们真正重视的是你正在编写的软件。

这意味着我将把大部分精力集中在build立有效的用户体验上,而不是“devise完美的数据库”上。 数据库实际上只是一个工具,使您能够提供用户体验。

关系数据模型的关键特征是数据和访问path的独立性。 您可以添加列,更改键,引入或删除索引等,同时对使用它的应用程序没有影响(或接近于零)。

这使得数据库结构非常灵活。

试图devise数据库以“对未来灵活”或“优化性能”主要是一种浪费的努力。

更改数据库的结构将对您的系统产生相对较小的影响。

另外,你真的无法预测数据库将如何扩展,直到遇到需要扩展的场景。 你最好的select是等到你遇到性能问题。 然后专门解决它们。

但是,更改应用程序的用户体验通常更昂贵。 用户界面工作非常耗时,通常需要一段时间才能正确使用。

所以,我会build议你:

  1. 只是产生一个糟糕的数据库devise
  2. 反应到你遇到的实际性能情况
  3. 把精力集中在用户体验上,而不是在数据库上

反驳Dillie-O的build议。 我build议你不要把你所有的查找放到一个表中。 一般来说,这是将OOdevise强制为关系数据库的尝试。 它可以完成,它符合OO开发人员的世界观,但会导致数据库devise的瘫痪。

跳到Google并search“MUCK表”,这会引导您讨论大规模统一代码键表。 或者,您可以查找“一个真正的查找表”进行讨论。 甚至可以阅读Joe Celko的文章One True Lookup Table 。

至于什么,这里的答案是“它取决于”。

数据库可以用来做不同的事情,其中​​一些事情将需要在devise和开发方面的反方向。

OLTP数据库系统的devise完全不同于用作报告或仓储解决scheme的系统。 第一个常常是正常化的,而且仓库通常是非标准化的。 这有助于系统达到预期的性能。

即使在这一部分内容中,根据使用情况是重读还是重写,不同的devise决策可能也是合适的。

最好的select是查看与您正在尝试构build的应用程序types相对应的更小的数据库开发部分的最佳实践。

我曾经读过的关于数据库devise的最好的书是Michael J Hernandez的“数据库devise”。 这个名字听起来像是一本初学者的书,但任何级别的人都可以从中获得知识。 它也是平台独立的,因为它涉及到查看数据本身以及如何正确组织数据 – 而不是使用的技术。

他还写了一本关于编写查询的书,我听说过(我自己还没有读过这个),这个查询名叫“SQL查询对于单纯的凡人”是相当不错的。

数据库devise为单纯的人

不要存储计算值

例如,表格“宽度”为“Squares”。 无需制作“区域”栏,因为可以通过宽度^ 2来计算

关系数据库是一个非常强大的抽象; 这是一个事实和谓词演算的集合。 不仅如此,SQL通过一个子句检查行而另一个子句更改行强制执行命令查询分离。

当您将数据库视为真实推理引擎时,build立一个不允许来自您正在build模的数据的矛盾的设置是有意义的。 因此,要有效地使用关系数据库,您需要正确地使用数据库devise。 与面向对象的程序的devise不同,对如何devise关系数据库有一个共识。 数据库devise的正确方法是合理的。 大多数人正常化到第三范式,但实际上可以达到第五范式。

如果可能的话,你想从你的数据库中删除空列值。 如果你同意我对数据库的看法是一个真实的推理引擎,那么空值是一个真正的问题。 当你在数据库中有空位时,被排除的中间的定律成立。 这使得数据库的任何特定属性的“矛盾certificate”变得更加困难,而没有空值。 空值不必要地使数据库的语义复杂化。

由于性能原因,有时需要打破规范化的规则。 但是,不要在有数据的情况下这样做,特别是查询的速度慢。 通常你可以通过仔细改变索引来加速查询,而不是非规范化。

最后,关于存储过程而不是直接查询。 在体面的数据库上,您可以独立于基础表设置存储过程的安全权限。 这本身就是足够的理由来考虑广泛使用存储过程。 通过存储过程,您可以构build比直接SQL访问更严格的安全模型。

在这个问题中,我没有find自己想要的东西,但是这个在DBdevise中有很多关于devise模式的build议

数据库规范化可能是最着名的最佳实践。 这套技术允许您devise您的数据库,以便删除冗余项目,并且逻辑上将字段分组。

如果你不在模式的描述列中logging枚举,那么我可以弄清楚'5'是什么在这里:

Select name from peeps where accountStatusId = 5 

然后做这个

用一个表来枚举一个字段。 例如:

 Select name from peeps p join accountStatus s on p.accountStatusID = s.asid where s.accountStatus = 'ActiveDude' 

Michael J. Hernandez的“ 数据库devise”( The Book of Michael J. Hernandez Database Design for Mere Mortals )书写得很好,而且很容易阅读。 它应该回答你所有的问题。

Hernandez还与John L. Viescas合着了“单纯的人类SQL查询”

这些书大概是60美元。 因为我失去了我的身份,所以我试图find“寻找真理人”的CD。 如果有人有副本,让我知道。

我会说,只要数据库正常化,如果你正在做一个VLDB,然后正确的分区,那么你应该没问题。 其他最佳实践包括使用CRUD存储过程,并确保所有表正确级联。 其他的一切都是主观的。 使用“Y / N”是从尚未引入位的旧学校数据库编程。 它也可以用于可伸缩性的目的,如“是/否/可能”,但是如果是这种情况的话,那么这些操作就会使标准化并制作查找表。

我们在这里使用的一个很好的概念是“查找代码”表。 如果你有一个数据库有很多引用项目的有效代码或types,或类似的,保持在一个单一的LookupCode表中的一个CodeGroup和代码本身的东西。

我们为代码的活动状态保留一个额外的标志,还有一些可选的数字列,如果给定的查找代码需要以任何方式进行sorting或计算,可以使用这些数字列。

通过这样做,你可以消除在你的模式中散布许多小小的桌子。 现在的一个缺点是表的主键是代码组和代码本身,所以没有外键附加到引用给定代码的“主”表,但是有一点在应用程序中的执行很容易适应这一点。