如何在数据库设计中为多个面向对象的组合关系建模?

时间:2019-05-01 20:22:50

标签: database-design database-schema

我有2个表,这些表可以提供一个相关记录,表示由以下类图近似建模的某些项目。这是高度简化的,每个来源本身就是不同的复合模型。

UML for the OO relationship of two sources that can contain instances of items

从数据库而不是面向对象的角度来看,项目表包含任何可能项目的记录。如果您想知道小部件的定义是什么或gewgaw的定义,那就是item表的目的。 Source *表代表物理物料的位置类型,每条记录代表一个特定的位置。 Source *表还包含大量不相交的信息。

小部件或gewgaw特定实例的集合包含在源中,即Source1有10个不同的小部件和3个不同的gewgaw,而Source2目前可能仅包含1个不同的小部件。

为了表示这种关系,如果仅存在1个源表,我通常将使用具有源ID和项目ID作为外键的数据透视表。

an ERD relating Source1 and Items through a pivot table

关于如何表示第二种类型的商店的我的第一个想法是创建另一个数据透视表,即item_source2,然后当我需要统计库存编号时,在item_source1和item_source2之间进行联合。

这看起来并不特别优雅,违反了DRY,并在可能不需要的地方引入了联合。

下一个想法是将item_source1表概括为也具有Source2.id键的字段。实际上,对于任何给定的记录,只有Source1.id或Source2.id中的一个是有效的引用,而另一个必须为null-特定的窗口小部件不能同时存在于两个位置。

从编程的角度来看,我可以创建逻辑来测试和执行此设计,但对我而言,这显然不是最佳实践,但我看不到如何通过数据库设计解决此问题。

我将在Laravel模式中实现这一点,但是也许在这里理解设计方面更为关键。

1 个答案:

答案 0 :(得分:2)

按照philipxy的建议,我猜您应该实现以下方式:

+-----------+    +------------+
|source1     |   |source2     |
+------------+   +------------+
+ PFK mykey  +   + PFK mykey  + <--- both reference "source"
+------------+   +------------+

+-----------+
|source     |
+-----------+
+ PK mykey  +
+-----------+

+----------------+
|shared relation |
+----------------+
+ FK myKey       + <--- references "source"
+ other attribs  +
+----------------+