Sql 超正常化的危险?

Sql 超正常化的危险?,sql,database-design,architecture,Sql,Database Design,Architecture,我和几位同事面临着一个具有严重性能影响的体系结构决策:我们的产品包括一个UI驱动的模式构建器,它允许非程序员为web应用构建自己的数据类型。目前,它在后台构建适当的规范化模式,并包含一些复杂的逻辑,以便在管理员更改数据类型时自动更改模式和迁移遗留数据 规范化模式在过去遇到了性能瓶颈,并且已经安排了一次主要的重构。其中一组开发人员希望将数据类型的每个属性存储在一个单独的表中,这样对数据类型的更改就不需要改变模式。(例如,只需更改应用程序逻辑,就可以将单个属性转换为1:n关系。) 因为早期的基准测试

我和几位同事面临着一个具有严重性能影响的体系结构决策:我们的产品包括一个UI驱动的模式构建器,它允许非程序员为web应用构建自己的数据类型。目前,它在后台构建适当的规范化模式,并包含一些复杂的逻辑,以便在管理员更改数据类型时自动更改模式和迁移遗留数据

规范化模式在过去遇到了性能瓶颈,并且已经安排了一次主要的重构。其中一组开发人员希望将数据类型的每个属性存储在一个单独的表中,这样对数据类型的更改就不需要改变模式。(例如,只需更改应用程序逻辑,就可以将单个属性转换为1:n关系。)

因为早期的基准测试表明这将带来巨大的性能损失,所以他们在应用程序代码中构建了一个缓存层,用于维护每种数据类型的非规范化版本。虽然它确实加快了查询速度,但我对应用程序层将承担的复杂性表示怀疑,但我希望得到反馈——我是否悲观?其他人是否成功部署了此类解决方案?我应该坚持己见,还是将复杂性从“模式修改工具”转移到“模式镜像工具”是一件好事

规范化模式已经成功 过去的性能瓶颈, 一个主要的重构已经完成 预定的。一群人中的一个 开发人员希望存储每个 属性中的数据类型 单独的表格,以便对 数据类型永远不需要架构 改变。(单一财产可以是 变成了1:n的关系,比如 例如,只需更改应用程序 逻辑。)

这听起来是个坏主意

  • 这会影响数据库的性能。如果您将这些东西存储在一行中,它们将在磁盘上物理地放在一起,并被视为一个东西,用于锁定等目的
  • 您编写的查询将需要大量额外的连接,这将是非常痛苦的。最终,您将编写视图,以使其恢复到最初应有的状态
  • 所描述的场景可能永远不会发生,因此您会放慢速度并使应用程序复杂化,但可能没有任何好处
  • 如果真的发生了这种情况,您将不得不重新编码和测试一堆应用程序代码,那么在那个时候进行数据库更改的额外工作量是多少?您可以创建子表,通过更新将数据向下复制到其中,然后从父表中删除列
  • 如果成功,将来可能会有不同的应用程序附加到数据库。他们将无法知道真正的模式是什么,因为这些信息由应用程序保存。数据库中的模型数据
  • 如果(a)内存太多,(b)扩展到多个应用程序服务器,(c)有不同的应用程序连接到数据库,应用程序服务器上的缓存可能会变得棘手。您正在解决一个由您自己造成的性能问题
  • 如果多列都位于子表中,则无法在多列上创建索引

  • 你所描述的与我所说的规范化不同。这更像是超抽象——试图找到某种抽象层次,其他一切都可以从中派生出来。就像javascript中的“对象”。如果你得出它的逻辑结论,你可以用两张表来应付;每个对象一个表,一列表示ObjectTypeCode和ObjectId;还有一个具有关联的表,有两个ObjectId列,第三个表示唯一性,第四个表示值


    我建议您需要重新访问您的域模型。你描述的那个对我来说听起来很可怕(但不幸的是,非常熟悉)。我有一个为我工作的人,他发明了一种叫做“物体”的桌子。有两个子表,ObjectAttributes和ObjectProperties。很难对两者之间的区别作出明确的解释。这张桌子(幸运的是,他)没撑多久。

    我们的团队解决了这个问题:

    结论-

    正如那句老话所说,正常化直到受伤,非正常化直到奏效


    严格地说,没有所谓的“超正常化”。如果一个完全规范化的模式被重构为另一个等效的完全规范化的模式,那么它们都是同等规范化的。通常所说的“超规范化”实际上是为了实现规范化以外的目标而进行的表分解

    如果我没看错的话,我不认为你在最初的帖子中描述的情况就是这样。似乎您的团队正在讨论规范化模式和非规范化模式

    当这由智能设计师手动完成时,在某些类型的非规范化设计所获得的性能优势与非规范化所带来的更新问题之间存在权衡。我希望你的产品能自动完成同样的任务,就像聪明的人类模式设计师一样,遇到同样的困难,然后是一些困难

    我猜你的网站真正的问题根本不是性能问题。相反,我认为这是让用户随意定义新数据类型的要求与从静态信息需求集派生的精心设计的数据库中获得相同结果的愿望之间的冲突

    在我看来,这两个目标是不可调和的。数据库中的最终数据管理层由用户社区完成。他们甚至可能不会召开委员会会议来决定哪些新的定义将成为标准和标准