我正在尝试对特化/泛化建模,倾向于使用类表继承(请参阅this answer)。
但是,我的同事在维护和性能方面存在问题,因为同一张表会有许多(50+)重叠的特化知识。他的建议是创建一个包含以下各列的表:
这样,所有属性都保存在一个表中,并且可以由专门化列进行过滤。我不知道这个设计叫什么,但我担心它与EAV有某种关系...
我主要关心的是modification anomalies,但除此之外,我没有看到任何原因,这不是一个好主意。一种解决方案明显优于另一种解决方案,还是我们应该选择一种并继续前进?
最佳答案
设计表时,我通常会记住一件事:用法。
我将如何在其中写入数据以及如何查询回来。我将设计偏向于读取或写入,因为这将对性能,重复性等更为重要。
您的问题并不能真正解释您的用法,因此,我在此处的答案中的所有建议都是完全推测。如果每天插入2万行,则设计将与每天插入5行不同。另外,如果您每天需要在任何类型的任何列上运行20k次搜索,或者每天运行5次。这些会影响您设置表格的方式。
话虽如此,一般的方法可能是做这样的事情:
50个以上重叠的特化表格将是编写查询的噩梦。我会尝试提出1个主要的通用表,也许还有5个左右的其他通用表,在这些表中您可能会稍微浸入“单表继承”(其中可能有几列不适用于每种类型,但是包含在内)您涵盖了尽可能多的类型的尽可能多的列)。从那里用类似EAV的方法覆盖其余的列。
关于database-design - 类表继承与非规范化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2623719/