【问题标题】:Database Design Best Practices [closed]数据库设计最佳实践 [关闭]
【发布时间】:2008-12-22 20:56:05
【问题描述】:

我非常精通 SQL Server、MySQL、Oracle 等,但抛开这些数据库产品不谈,是否有资源可以帮助我很好地设计关系数据库?是否有类似数据库设计的模式或最佳实践之类的东西?

我曾多次看到数据库通常不可扩展;人们有个人偏好,喜欢保留像 isChecked 列这样的列,它本质上是布尔值,但存储为 Char(1),其值像 'Y' 和 'N' 而不是 0 和 1,这对我来说听起来更好。做数据库设计时不犯常见错误的方法?

我们非常感谢您提供书籍或文章的链接。

提前致谢。

【问题讨论】:

  • 这很荒谬,因为没有建设性而被关闭。有时我不明白为什么我一直访问这个网站。
  • 亲爱的问题结束用户:请告诉我们,我们应该在哪里提出这样的问题。
  • 这里有一些我觉得有用的东西codeproject.com/Articles/359654/…

标签: database-design


【解决方案1】:

几点:

  • 尽可能多地了解问题域。如果不知道自己的设计目的,就无法创建好的数据模型
  • 熟悉您的数据库提供商提供的数据类型
  • 如何正确使用规范化和设计表
  • 性能:何时以及如何应用索引,如何编写高效的查询等。
  • 何时以及如何使用不同的数据库对象,如视图、过程、函数、触发器

【讨论】:

  • 另一个要学习(或意识到)的点是,您认为应该在应用程序数据层中的逻辑实际上可以通过触发器直接在数据库中实现,外键、视图等,并大大降低了数据完整性丢失的可能性。
【解决方案2】:

有许多数据库设计模式。它们通常没有很好的形式化,因此您可能需要简单地查看大量数据库设计。

例如,请参阅Fowler's books 了解设计模式。还有Nock's Book

有博客,比如database programmer

有一本 IEEE 书,On Pattern-Based Database Design and Implementation

Google 搜索 (link) 获得了 2400 万次点击。

【讨论】:

  • 诺克先生+1...这本书是宝石!!
【解决方案3】:

我对此的看法有些相反。 我建议,不要过分强调数据库的设计。

有时这可能很难。对于内部 LOB 应用程序,企业的主流观点通常是数据是主要资产,而软件在某种程度上是可消耗的。

我的建议是:不要买。

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

这意味着,即使他们可能高度重视数据,但他们实际重视的是您正在编写的软件。

这意味着我会将您的大部分精力集中在构建有效的用户体验上,而不是“设计完美的数据库”上。数据库实际上只是一种工具,可让您提供用户体验。

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

这使得数据库结构非常柔韧。

试图将数据库设计为“面向未来”或“优化性能”大多是徒劳的。

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

此外,在遇到需要扩展的场景之前,您真的无法预测数据库将如何扩展。最好的选择是等到遇到性能问题。然后具体解决它们。

但是,更改应用的用户体验通常会更昂贵。 UI 工作很耗时,而且通常需要一段时间才能做好。

所以,我建议你:

  1. 只做一个糟糕的数据库设计
  2. 对您遇到的实际性能场景做出反应
  3. 专注于用户体验,而不是数据库

【讨论】:

  • 其实很好的建议。通常这门学科的学生会看到一个好的设计,这对他们来说就像魔法一样,但如果他们从第 1 步开始就不会了。+1
【解决方案4】:

反驳 Dillie-O 的建议。我建议您不要将所有查找放在一张表中。通常,这是将 OO 设计强制到关系数据库中的一种尝试。可以做到,并且符合 OO 开发人员的世界观,但会导致数据库设计瘫痪。

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

【讨论】:

    【解决方案5】:

    我没有在这个问题中找到我要找的东西,但是this one 有很多关于 DB 设计中的设计模式的建议

    【讨论】:

      【解决方案6】:

      不存储计算值

      例如,您有表格“正方形”,列“宽度”。不需要列“面积”,因为可以通过 width ^ 2

      计算

      【讨论】:

      • 一般是的,但也有很多例外。
      • 只是好奇,你能说出一个吗?也许如果手头的计算字段非常耗费资源来计算?
      • 如果您的系统不支持基于函数的索引,并且您希望能够对计算值进行索引。
      • 很好的例子,我从来没想过! (不过,如果您不尝试索引“区域”,我的建议仍然有效)
      • 可能在数据仓库场景中,您最感兴趣的是报告数据,而不是后处理。
      【解决方案7】:

      与任何事情一样,这里的答案是“视情况而定”。

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

      OLTP 数据库系统的设计与用作报告或仓储解决方案的系统完全不同。第一个通常是规范化的,而仓库通常是非规范化的。这有助于系统获得预期行为所需的性能。

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

      最好的办法是针对与您尝试构建的应用程序类型相对应的较小的数据库开发部分研究最佳实践。

      【讨论】:

        【解决方案8】:

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

        他还写了一本关于编写查询的书,名为《SQL Queries for Mere Mortals》,我听说(我自己还没有读过这本书)相当不错。

        Database Design for Mere Mortals

        【讨论】:

          【解决方案9】:

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

          当您将数据库视为真值推理引擎时,设置一个不允许矛盾从您正在建模的数据中流出的设置是有意义的。因此,要有效地使用关系数据库,您需要正确设计数据库。与面向对象程序的设计不同,对于应该如何设计关系数据库存在共识。合理的数据库设计方法是normalise。大多数人标准化到第三范式,但实际上你可以升到第五范式。

          如果可能,您希望从数据库中删除空列值。如果您同意我将数据库视为真理推理引擎的观点,那么空值就是一个真正的问题。当您在数据库中有空值时,排中定律 成立。这使得数据库的任何给定属性的“矛盾证明”比没有空值的情况更加困难。空值不必要地使数据库的语义复杂化。

          有时出于性能原因需要打破规范化规则。但是,在您获得数据关于什么是特别慢的查询之前,不要这样做。通常,您可以通过仔细更改索引而不是反规范化来简单地加快查询速度。

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

          【讨论】:

            【解决方案10】:

            最著名的最佳实践可能是数据库规范化。这组技术允许您设计数据库,以便删除多余的项目,并对字段进行逻辑分组。

            【讨论】:

            • 他们在学校里宣扬这个......进入现实世界,我发现这并不总是一件好事!
            【解决方案11】:

            如果您没有在架构的描述列中记录枚举,以便我可以弄清楚其中的“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'
            

            【讨论】:

              【解决方案12】:

              Michael J. Hernandez 的书为凡人设计的数据库写得很好,而且很容易阅读。它应该回答你所有的问题。

              Hernandez 还与 John L. Viescas 合着了 SQL Queries for Mere Mortals

              这些书每本大约 60 美元。我正在努力寻找《凡人之问》的 CD,因为我弄丢了我的。如果有人有副本,请告诉我。

              【讨论】:

                【解决方案13】:

                我会说,只要数据库是规范化的,并且如果您正在制作一个 VLDB,然后正确地对其进行分区,那么您应该没问题。其他最佳实践包括对存储过程使用 CRUD 并确保所有表正确级联。大多数其他一切都是主观的。使用“Y/N”是尚未引入比特时的老式数据库编程。它也可以用于可扩展性目的,例如“Y/N/Maybe”,但如果是这种情况,basast 实践会说要对其进行规范化并制作一个查找表。

                【讨论】:

                  【解决方案14】:

                  我们在这里使用的一个非常好的概念是“查找代码”表。如果您有一个数据库,其中包含对有效编码或类型等项目的大量引用,请将所有这些引用保存在单个 LookupCode 表中,该表基于 CodeGroup 和代码本身。

                  我们为代码的活动状态保留了一个附加标志,以及一些可选的数字列,如果需要以任何方式对给定的查找代码进行排序或计算,可以使用这些列。

                  通过这样做,您可以消除大量分散在架构周围的小表格。现在这样做的一个缺点是表的主键是代码组和代码本身,所以没有附加到引用给定代码的“主”表的外键,但是一点点应用程序中的强制执行很容易适应这一点。

                  【讨论】:

                  • -1:这也掩盖了连接到表的基数,使数据完整性更难以实施,并且被广泛认为是一种不好的做法。
                  猜你喜欢
                  • 1970-01-01
                  • 2011-05-09
                  • 1970-01-01
                  • 2013-06-30
                  • 2018-02-11
                  • 2011-11-23
                  • 2010-12-01
                  • 2010-10-30
                  相关资源
                  最近更新 更多