mySQL-我应该去规范化吗?

mySQL-我应该去规范化吗?,mysql,database,database-design,denormalization,Mysql,Database,Database Design,Denormalization,概述(很抱歉,它含糊不清-我想如果我更详细一些,事情会变得过于复杂) 我有三个表,表一包含一个id,表二包含它自己的id和表一的id,表三包含它自己的id和表二的id 我花了很多时间思考,我认为表3也包含相关的表id会更有效 -这意味着我不必连接三个表,我只需查询表三(对于经常使用的查询) -通过只锁定表3中包含表1中特定id的行,我可以更轻松地实现预订系统 对于任何想了解更多数据库布局的人,这里有更多信息 问题 什么是非正常化的不利因素?我见过一些人完全反对它,还有一些人认为在正确的情况下,它

概述(很抱歉,它含糊不清-我想如果我更详细一些,事情会变得过于复杂)

我有三个表,表一包含一个id,表二包含它自己的id和表一的id,表三包含它自己的id和表二的id

我花了很多时间思考,我认为表3也包含相关的表id会更有效

-这意味着我不必连接三个表,我只需查询表三(对于经常使用的查询)

-通过只锁定表3中包含表1中特定id的行,我可以更轻松地实现预订系统

对于任何想了解更多数据库布局的人,这里有更多信息

问题


什么是非正常化的不利因素?我见过一些人完全反对它,还有一些人认为在正确的情况下,它是一个有用的工具。id永远不会改变,因此除了必须插入相同的数据两次之外,我真的看不到任何缺点,因此它将消耗的额外空间(因为它只是id,所以肯定可以忽略不计)。

我的建议是遵循以下一般规则:默认情况下正常化,然后,当您发现一个性能问题并将其解决时,对其进行反规范化


我发现标准化数据和处理数据的代码更容易维护,也更符合逻辑。我认为使用非规范化来提高性能没有任何问题,但我不会投机地应用任何性能优化,这会降低可维护性,直到您确定它们是必要的。

您真正想要非规范化的唯一时间是,如果需要获得您想要的性能


这已经被问了好几次了。请参见

标准化与效率通常是一种折衷,虽然标准化通常是一件好事,但它不是一颗灵丹妙药。如果你有一个明确的理由(就像你看起来做的那样),反规范化是完全可以接受的。

如果有充分的理由,每一条规则都可能被打破

就你的情况而言,我想知道这三张表包含哪些内容。表三真的描述了表二还是直接描述了表一

在这种情况下,在表三中使用self id、表二id和表一id的缺点是,这可能会导致不一致-如果表二中的表一id 1和表三中的表一id 15是错误的,该怎么办

它取决于数据和数据的实体关系。对我来说,更重要的是没有不一致的地方,在选择的时候有多一点时间


编辑:在阅读了您的表格之后,我建议在表三(区域)中添加一个表一id,因为表一id毕竟没有变化,因此它相对地保留了不一致性。

作为一个之一(表1)到多个(表2),另一个一个(表2)对于许多(表3),我会保持相同的结构,因为它们似乎有3层

e、 g

  • 表1
    • 表2
      • 表3

此外,这在很大程度上取决于您在这些表中存储的其他字段。

包含不完全规范化的表的模式遭受所谓的“有害冗余”。有害的冗余可能导致将同一事实存储在多个位置,或者导致没有任何位置存储需要存储的事实。这些问题称为“插入异常”、“更新异常”或“删除异常”

长话短说,如果您将一个事实存储在多个地方,那么您迟早会在这两个地方存储相互矛盾的事实,并且您的数据库将开始给出相互矛盾的答案,这取决于查询找到的事实的版本

如果您被迫“发明一个虚拟记录”以便有一个存储所需事实的位置,那么您迟早会编写一个查询,错误地将虚拟记录视为真实记录

如果你是一个超级程序员,而且从不犯错,那么你就不必担心上述问题。我从未见过这样的程序员,尽管我见过很多人认为他们从不犯错

我不会把“非规范化”作为一种实践。这就像“开车离开芝加哥”。你仍然不知道你要去哪里。然而,正如其他人所指出的那样,有时应该忽略规范化规则。如果您正在设计星型模式(或雪花模式),那么为了获得最佳的星型模式(或雪花模式),您必须忽略一些规范化规则

关于“我应该吗?”:绝对不是;反规范化通常在出现重大的、不可度量的性能问题时使用。除非你有这一点(并且可以用硬数据支持这一说法),否则你不应该这样做,因为好处将微乎其微。看见