这主要是与数据库相关的问题,但我使用的是VB.net和sqlite。
所以我有一组小工具,它们都有一组属性。其中有“类型”属性。
根据Type属性,还有一系列其他类型相关的属性。我想知道将这些组合成一个具有大量空值的单个表(然后可能是单个类)通常是个好主意,还是应该将它们组织在多个表中的数据库中(使用派生类),或者某些东西别的?
示例:
它们是否应该在这样的表中组织,并且有很多空值:
或者像这样:
最终可能有数千个小部件,可能有20种类型。
谢谢!
答案 0 :(得分:1)
在OOP世界中,您通过“类型”属性实现的内容通常会通过继承来实现。
继承可以在具有父表的数据库中建模(每个窗口小部件有一个记录,无论类型如何,只存储基本窗口小部件类的字段),以及每个窗口小部件子类型的子表。
这可以使所有小部件上的操作更容易(而不是执行不相关的小部件表的UNION)。
然而,它也可能使事情变得更加困难。例如,要获取一个窗口小部件的所有字段,您需要将父表中的记录与相应子窗口中的记录连接起来。
以下是关于此主题的另一篇文章:Table "Inheritance" in SQL Server
答案 1 :(得分:0)
您要做的是object-relational mapping,但是您遇到了object-relational impedance mismatch (另请阅读Object-Relational Mapping is the Vietnam of Computer Science。)
没有简单的解决方案。
你可以做的是列出你的程序将在小部件表上执行的所有操作,分析它们如何与两个组织一起工作,然后选择你估计的那个更易于使用和维护。
答案 2 :(得分:0)
如果域模型使用继承,则应使用表继承。
最简单,最快速的方法是单表继承,这是Martin Fowler推荐的。是的,你最终得到了空字段。如果它们位于表的“末端”,那么现代数据库非常适合压缩它们。
更正确的方法是类表继承,它解决了你的“问题”但更复杂,更慢。
无论哪种方式,对于正确而灵活的解决方案,您确实需要表继承。例如,如果您的订单行项目可以用于服务或产品,那么表继承确实有用。