3

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

所以我有一组小部件,它们都有一组特定的属性。其中有一个“类型”属性。

根据 Type 属性,还有一系列额外的依赖于类型的属性。我想知道将它们分组到具有大量空值的单个表(然后可能是单个类)中是否通常是一个好主意,或者是否应该将它们组织在数据库中的多个表(具有派生类)中,或者其他什么别的?

例子:

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

它们是否应该像这样组织在一个包含很多空值的表中:

  • 小工具
    • ID、尺寸、颜色、类型、重量、isShiny、透明度、宽度、长度、高度

或者像这样:

  • 小工具
    • ID、尺寸、颜色、类型
  • 小程序_A
    • ID, 重量, isShiny
  • 小工具_B
    • 身份证,透明度
  • 小程序_C
    • ID、宽度、长度、高度

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

谢谢!

4

3 回答 3

1

在 OOP 世界中,您根据“类型”属性实现的内容通常会通过继承来实现。

继承可以在具有父表的数据库中建模(每个小部件有一条记录,无论类型如何,只存储基本小部件类的字段)和每个小部件子类型的子表。

这可以使对所有小部件的操作变得更容易(而不是对不相关的小部件表进行 UNION)。

但是,它也可能使事情变得更加困难。例如,要获取一个小部件的所有字段,您需要将父表中的记录与相应子表中的记录连接起来。

这是关于此主题的另一篇文章:SQL Server 中的表“继承”

于 2012-10-11T13:49:07.887 回答
0

What you are trying to do is object-relational mapping, but you are running into the object-relational impedance mismatch.
(Also read Object-Relational Mapping is the Vietnam of Computer Science.)

There is no easy solution.

What you could do is to list all operations your program will be doing on the widgets table(s), analyze how they would work with both organizations, and then choose the one that you estimate is easier to use and maintain overall.

于 2012-10-11T13:27:19.037 回答
0

如果您的域模型使用继承,则应该使用表继承。

最简单、最快的方法是单表继承,这是 Martin Fowler 推荐的。是的,你最终得到空字段。如果它们位于表格的“末尾”,那么现代数据库非常适合压缩它们。

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

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

于 2012-10-11T19:12:35.267 回答