【问题标题】:Should related objects be grouped in one table, or multiple?相关对象应该分组在一个表中还是多个表中?
【发布时间】:2012-10-12 03:12:35
【问题描述】:

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

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

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

例子:

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

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

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

或者像这样:

  • 小工具
    • ID、尺寸、颜色、类型
  • 小工具_A
    • ID、重量、光泽度
  • 小工具_B
    • ID、透明度
  • 小工具_C
    • ID、宽度、长度、高度

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

谢谢!

【问题讨论】:

  • 基本上,您预计要处理多少个小部件?
  • 只是在编辑它。数千个,大约 20 种类型。每种类型都有 1-10 个自己的独特属性。
  • 在不知道这 20 种类型的确切性质的情况下,我会建议为每种类型分别设置一个表格。 SQLite 语言具有 CREATE VIEW 语句,最终,您将能够以有意义的方式重新加入信息。

标签: database vb.net sqlite database-design


【解决方案1】:

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

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

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

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

这是关于此主题的另一篇文章:Table "Inheritance" in SQL Server

【讨论】:

  • 我实际上是从我的 OO 应用程序中继承的对象开始的,当涉及到长期存储这些信息时,它让我遇到了一个问题,如果没有一个巨大的表,我就无法轻松做到这一点空填充列的数量或很多表。感谢您的链接
【解决方案2】:

您正在尝试做的是object-relational mapping,但您遇到了object-relational impedance mismatch
(另请阅读Object-Relational Mapping is the Vietnam of Computer Science。)

没有简单的解决方案。

您可以做的是列出您的程序将在小部件表上执行的所有操作,分析它们将如何与两个组织一起工作,然后选择您估计的一个整体上更易于使用和维护。

【讨论】:

  • “没有简单的解决方案。”这让我在某种程度上感觉更好。这几天我一直在想。很高兴知道我的直觉“这实际上很复杂,而不仅仅是“忘记了复杂的事情”。感谢您的链接!您只能每 5 秒编辑一次评论。(单击此框可关闭)
  • 不匹配!= 不可能。阅读一些福勒。
【解决方案3】:

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

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

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

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

【讨论】:

  • 在 SQLite 中,所有行中的所有值都需要一个字节来存储类型,但对于 NULL 值,仅此而已。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2011-06-18
  • 2018-10-23
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多