Sql 结构化关系数据库-组合相似表和相关表

Sql 结构化关系数据库-组合相似表和相关表,sql,normalization,Sql,Normalization,我习惯于看到不同实体存储在不同表中的关系数据库。(简单示例:国家、州、城市)。最近,我看到更多的情况,不同但相似的实体被捆绑到同一个表中,并与不同的视图组合在一起。我认为这可以节省表格和数据访问程序(可能以牺牲清晰度和灵活性为代价)。重新阅读规范化数据库的定义,我不认为这违反了任何规则,但它似乎不那么直观,通过回到旧的大型机“杂项”表,您可以在其中放置在设计阶段被遗忘的任何内容。请参见以下两个示例:多表解决方案与单表解决方案。这种现象是数据或编程设计模式的一部分,并且有名称吗 如果您有小型专用表

我习惯于看到不同实体存储在不同表中的关系数据库。(简单示例:国家、州、城市)。最近,我看到更多的情况,不同但相似的实体被捆绑到同一个表中,并与不同的视图组合在一起。我认为这可以节省表格和数据访问程序(可能以牺牲清晰度和灵活性为代价)。重新阅读规范化数据库的定义,我不认为这违反了任何规则,但它似乎不那么直观,通过回到旧的大型机“杂项”表,您可以在其中放置在设计阶段被遗忘的任何内容。请参见以下两个示例:多表解决方案与单表解决方案。这种现象是数据或编程设计模式的一部分,并且有名称吗


如果您有小型专用表,那么数据库可以轻松地在内存中缓存所需的表

如果您将原本是小表的内容塞进一个表中,那么数据库不知道哪些条目对缓存很重要,哪些不重要

更重要的是,出现错误的机会更多,因为您可能会无意中键入错误的类型代码,并最终加入到不相关的内容中,而没有RI或类型检查来警告您。如果使用小型专用表,则可以指定RI约束

回想一下我看到单一monster查找表模式完成的地方,我认为吸引人的是开发人员可以添加更多种类的条目,而不需要DBA干预来创建更多的表。有很多开发人员,只有少数DBA,这就是DBA避免每次引入新类型的查找条目时都必须创建专用查找表的原因。(显然,在dev中授予create table权限对那里的dba来说是不可接受的。)

对于数据库模式更改很难实现的环境,这似乎是一种变通方法。但另一个考虑因素是,如果所有条目都在一个表中,则国际化可能更容易

这个模式有一个固定的名字,叫做。链接文章将其称为反模式,并列出了该技术的更多缺点。以下是文章中的项目列表:

  • 它使SQL看起来很难看

  • 许多语句将需要对查找表进行多个联接。额外的连接列使语句看起来更大、更可怕。使用单独的查找表时,将有相同数量的联接,但这些联接将更简单

  • 对同一个表的多个引用会使您很难确定执行计划中发生了什么,因为您将在那里看到这些重复引用,并且必须引用谓词才能理解表引用的上下文。如果您使用的是单独的查找表,那么在执行计划的任何时候都可以清楚地看到您所引用的表

  • 您不能使用此类型表的外键。从技术上讲,如果您愿意将这两列(lookup\u type\u code和lookup\u key)都放在表中,您可以这样做,但您不会这样做,因为这样做很难看。这意味着随着时间的推移,您的数据完整性很有可能会受到损害。为单个查找表设置外键非常容易,因此可以保护您的数据

  • 很难控制表格的内容。它是一个共享资源,所以检查约束和触发器是有问题的。如果您需要用户拥有不同的权限,这取决于他们正在处理的查找,那么事情就会变得一团糟。使用单独的查找表,这将非常容易

  • 如果需要更改一种引用类型,如扩展键或值的大小,则会影响所有引用数据。使用单独的查找表可以隔离更改

  • 随着时间的推移,许多参考表会包含更多的数据。要建模,您需要从这个共享查找表中分离出引用数据,或者开始添加可选列以处理“一次性”问题。这样的更改对于单独的查找表来说非常简单

  • 数据类型很重要。您应该始终使用正确的数据类型,因为它将减少所需的数据类型转换次数。隐式数据类型转换是等待发生的错误

  • 性能可能是OTLT方法的一个问题,因为优化器很难对数据做出正确的判断。优化器关心基数,但如果处理大量行,可能很难做出决定,其中大多数行在任何特定上下文中都是无关的。优化器还关心高/低值,但这些值与任何一个查找无关,而是共享的。我们还提到,您可能不会使用此数据的外键,这将减少优化器在做出决策时的信息量。您可能人为地将列设置为可选的,这实际上是强制性的,键必须有值,但是哪一列?我想你明白了


如果您有小型专用表,那么数据库可以轻松地在内存中缓存所需的表

如果您将原本是小表的内容塞进一个表中,那么数据库不知道哪些条目对缓存很重要,哪些不重要

更重要的是,出现错误的机会更多,因为您可能会无意中键入错误的类型代码,并最终加入到不相关的内容中,而没有RI或类型检查来警告您。如果使用小型专用表,则可以指定RI约束

回想一下我看到单一monster查找表模式完成的地方,我认为吸引人的是开发人员可以添加更多种类的条目,而不需要DBA干预来创建更多的表。当时有很多开发人员,只有几个DBA,而这个