我有两个表,它们可以提供一个相关的记录,表示由下面的类图近似建模的一些项目。这是高度简化的,每个源都是各自不同的复合模型。
从数据库而不是OOP的角度考虑这一点,items表包含任何可能项目的记录。如果您想知道小部件的定义是什么或者gewgaw的定义是什么,这就是item表的目的。Source*表代表物理项目的位置类型,每个记录代表一个特定的位置。Source*表还包含大量不相交的信息。
源代码中包含小部件或gewgaw的特定实例的集合,即Source1有10个不同的小部件和3个不同的gewgaw,而Source2目前可能只包含一个不同的小部件。
为了表示这种关系,如果只存在一个源表,我通常会使用一个透视表,并将源id和项目id作为外键。
关于如何表示第二种类型的商店,我的第一个想法是创建另一个数据透视表,即item_source2,然后当我需要统计汇总库存数字时,在item_source1和item_source2之间执行联合。
这看起来并不是特别优雅,违反了DRY,并引入了一个可能不需要的联合。
下一个想法是对item_source1表进行泛化,使其也具有Source2.id键的字段。实际上,对于任何给定的记录,只有Source1.id或Source2.id中的一个是有效的引用,而另一个必须为空-一个特定的小部件不能同时存在于两个位置。
从编程的角度来看,我可以创建逻辑来测试和实施这种设计,但我很清楚这不是最佳实践,但我看不到如何通过数据库设计来解决这个问题。
我将在Laravel模式中实现这一点,但也许理解设计方面在这里更为关键。
发布于 2019-05-02 05:23:21
根据philipxy的建议,我猜你应该实现这样的东西:
+-----------+ +------------+
|source1 | |source2 |
+------------+ +------------+
+ PFK mykey + + PFK mykey + <--- both reference "source"
+------------+ +------------+
+-----------+
|source |
+-----------+
+ PK mykey +
+-----------+
+----------------+
|shared relation |
+----------------+
+ FK myKey + <--- references "source"
+ other attribs +
+----------------+
https://stackoverflow.com/questions/55942271
复制相似问题