相关对象应该分组在一个表中,还是多个?

时间:2012-10-11 11:56:42

标签: database vb.net sqlite database-design

这主要是与数据库相关的问题,但我使用的是VB.net和sqlite。

所以我有一组小工具,它们都有一组属性。其中有“类型”属性。

根据Type属性,还有一系列其他类型相关的属性。我想知道将这些组合成一个具有大量空值的单个表(然后可能是单个类)通常是个好主意,还是应该将它们组织在多个表中的数据库中(使用派生类),或者某些东西别的?

示例:

  • 小工具1:小,蓝色,A型,20磅,闪亮
  • 小工具2:小,红色,B型,透明
  • 小工具3:大,黄,C型,6英尺,5英尺,1英尺

它们是否应该在这样的表中组织,并且有很多空值:

  • Widgits
    • ID,尺寸,颜色,类型,重量,isShiny,透明度,宽度,长度,高度

或者像这样:

  • Widgits
    • ID,尺寸,颜色,类型
  • Widgits_A
    • ID,重量,isShiny
  • Widgits_B
    • ID,透明度
  • Widgits_C
    • ID,宽度,长度,高度

最终可能有数千个小部件,可能有20种类型。

谢谢!

3 个答案:

答案 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推荐的。是的,你最终得到了空字段。如果它们位于表的“末端”,那么现代数据库非常适合压缩它们。

更正确的方法是类表继承,它解决了你的“问题”但更复杂,更慢。

无论哪种方式,对于正确而灵活的解决方案,您确实需要表继承。例如,如果您的订单行项目可以用于服务或产品,那么表继承确实有用。