1
1
仅仅为了“少桌子”的担心通常是完全错误的。事实上,当包含名为“table_name”的列时,毫无疑问,设计者非常清楚他实际上是将多个表合并为一个表。在您的例子中:要与表1中的内容关联的text_值,要与表2中的内容关联的text_值,以及要与表3中的内容关联的text_值。 从关系上讲, 它确实是一个完全的反模式,但是SQL语言的几个“特性”有时会迫使设计者进入这些模式。(例如,对分布式密钥)缺乏支持——在不同[相似的]表中强制执行键值的唯一性。此外,“SyrdIdTABLE”的设计者可能更多地考虑要填充它所需的任何UI,看到三个表“完全相同”(它们不是因为他看不到的原因)。决定把它们统一起来会“更好”,所以只有一个程序/窗口/……将需要更新“共享表”。 Waterbed theory . 他在编写大量代码方面节省了一些成本(毫无疑问,在他看来是重复的),而现在系统中其他地方出现了更复杂的操作和完整性强制执行的新成本。 |
2
3
简而言之:不必要的糟糕设计。 长话短说:有几件事要考虑。 首先,外键首先是 约束 ,一种确保数据完整性/正确性的机制。如果设计排除使用它们,则必须以其他方式确保完整性——使用声明性多表约束(如果DBMS支持它们)、过渡约束(DITTO)、触发器、应用程序代码或没有任何东西,以减少良性。外键简单、可靠、高效。利用它们是明智的。 其次,设计混乱。我使用ER建模和这样的图表,主要用于草图和文档,而不是规范,因为符号不够丰富,无法捕获关系模型提供的所有可能性,并且限制了我的思维。但是这个图表在任何情况下都不能正常工作,因为它并不能清楚地说明这些表是如何协同工作的。你需要一个实质性的文本框来解释,而且图表本身是没有用的。 这些缺点可能超过了拥有更少的表这一值得怀疑的好处。(表是关系模型擅长的,没有理由害怕它们。)但当然,这必须根据所讨论的数据库的全部需求和设计进行评估。 |
3
0
如果您考虑ER建模中的继承,这很容易解决。考虑一下
|