一个表中具有多种类型的对象的属性

时间:2019-07-03 11:06:15

标签: database postgresql database-relations database-table

我遇到这样的情况: 我在一张桌子上有多个对象,通常我的列取决于诸如起重机,挖掘机等对象的类型。

我的问题是,起重机除挖掘机外还有其他参数,因此几列具有null值。我以为我可以做另一个表(attributes)并在属性表和设备表之间添加一个关系。表attributes将具有id attributeName attributeValue equipmentId甚至还有type(以在attributeValue中定义值的类型)。这是个好主意吗?也许有解决这个问题的其他方法?

2 个答案:

答案 0 :(得分:1)

这取决于您对这些表的处理方式。

我可以想象以下解决方案:

  1. 保留当前的解决方案。

    这将导致混乱的表定义,随着新对象的加入,您可能必须添加更多列,但是NULL值不会占用PostgreSQL表中的任何空间。

    如果您需要使用外键引用该表并希望表的数量尽可能少,这是一个很好的解决方案。

  2. 有一个表,该表仅包含所有对象共有的列,并为每个对象定义一个带有其他列的表。这些表具有指向所有对象表的UNIQUE外键。

    这与第一个解决方案相似,但最终只剩下相关的列。

    您的查询将具有更多的联接,但是如果您只想访问某种类型的对象,则可能会更快。

  3. 每种对象类型只有一个表,没有公用表。

    这将使查询只访问一种类型的对象的查询变得更简单,更快捷,但是您不能拥有针对所有对象的外键。

  4. 有一个空表,其中包含所有对象公用的列,并有一个继承自公用表的每种对象类型的表。

    这是3的变体,但是可以强制使用公共列,并可以更轻松地在所有对象之间编写查询。

答案 1 :(得分:0)

您正在用关系模型表示对象数据。

假设这样做有充分的理由,请考虑将设备与属性关联的m:n关系X

  • X可以具有instance属性,以使用其属性值指定(标识)特定的对象实现。
  • 实例的所有值将与value中的X列一起使用
    (虽然您可能会使用标准化为字符串表示形式(例如xml模式)的类型系统,但可能有几列可以满足不同的数据类型)
  • 对象类型/类将与设备表一起使用,在该表中可能会添加表示继承关系的其他属性,但是如果需要的话,它们很可能具有自己的关系(表)。

专业人士:

  • 属性可以在不同类型/类的对象之间共享。
  • 不同对象类型/类的属性集不必处于子集/超集关系中

骗局:

  • 复杂度