Sql 超正常化的危险?
我和几位同事面临着一个具有严重性能影响的体系结构决策:我们的产品包括一个UI驱动的模式构建器,它允许非程序员为web应用构建自己的数据类型。目前,它在后台构建适当的规范化模式,并包含一些复杂的逻辑,以便在管理员更改数据类型时自动更改模式和迁移遗留数据 规范化模式在过去遇到了性能瓶颈,并且已经安排了一次主要的重构。其中一组开发人员希望将数据类型的每个属性存储在一个单独的表中,这样对数据类型的更改就不需要改变模式。(例如,只需更改应用程序逻辑,就可以将单个属性转换为1:n关系。) 因为早期的基准测试表明这将带来巨大的性能损失,所以他们在应用程序代码中构建了一个缓存层,用于维护每种数据类型的非规范化版本。虽然它确实加快了查询速度,但我对应用程序层将承担的复杂性表示怀疑,但我希望得到反馈——我是否悲观?其他人是否成功部署了此类解决方案?我应该坚持己见,还是将复杂性从“模式修改工具”转移到“模式镜像工具”是一件好事 规范化模式已经成功 过去的性能瓶颈, 一个主要的重构已经完成 预定的。一群人中的一个 开发人员希望存储每个 属性中的数据类型 单独的表格,以便对 数据类型永远不需要架构 改变。(单一财产可以是 变成了1:n的关系,比如 例如,只需更改应用程序 逻辑。) 这听起来是个坏主意Sql 超正常化的危险?,sql,database-design,architecture,Sql,Database Design,Architecture,我和几位同事面临着一个具有严重性能影响的体系结构决策:我们的产品包括一个UI驱动的模式构建器,它允许非程序员为web应用构建自己的数据类型。目前,它在后台构建适当的规范化模式,并包含一些复杂的逻辑,以便在管理员更改数据类型时自动更改模式和迁移遗留数据 规范化模式在过去遇到了性能瓶颈,并且已经安排了一次主要的重构。其中一组开发人员希望将数据类型的每个属性存储在一个单独的表中,这样对数据类型的更改就不需要改变模式。(例如,只需更改应用程序逻辑,就可以将单个属性转换为1:n关系。) 因为早期的基准测试
你所描述的与我所说的规范化不同。这更像是超抽象——试图找到某种抽象层次,其他一切都可以从中派生出来。就像javascript中的“对象”。如果你得出它的逻辑结论,你可以用两张表来应付;每个对象一个表,一列表示ObjectTypeCode和ObjectId;还有一个具有关联的表,有两个ObjectId列,第三个表示唯一性,第四个表示值
我建议您需要重新访问您的域模型。你描述的那个对我来说听起来很可怕(但不幸的是,非常熟悉)。我有一个为我工作的人,他发明了一种叫做“物体”的桌子。有两个子表,ObjectAttributes和ObjectProperties。很难对两者之间的区别作出明确的解释。这张桌子(幸运的是,他)没撑多久。我们的团队解决了这个问题: 结论- 正如那句老话所说,正常化直到受伤,非正常化直到奏效
严格地说,没有所谓的“超正常化”。如果一个完全规范化的模式被重构为另一个等效的完全规范化的模式,那么它们都是同等规范化的。通常所说的“超规范化”实际上是为了实现规范化以外的目标而进行的表分解 如果我没看错的话,我不认为你在最初的帖子中描述的情况就是这样。似乎您的团队正在讨论规范化模式和非规范化模式 当这由智能设计师手动完成时,在某些类型的非规范化设计所获得的性能优势与非规范化所带来的更新问题之间存在权衡。我希望你的产品能自动完成同样的任务,就像聪明的人类模式设计师一样,遇到同样的困难,然后是一些困难 我猜你的网站真正的问题根本不是性能问题。相反,我认为这是让用户随意定义新数据类型的要求与从静态信息需求集派生的精心设计的数据库中获得相同结果的愿望之间的冲突 在我看来,这两个目标是不可调和的。数据库中的最终数据管理层由用户社区完成。他们甚至可能不会召开委员会会议来决定哪些新的定义将成为标准和标准