Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 如何在数据库设计中建模多个面向对象的组合关系?_Database Design_Database Schema - Fatal编程技术网

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

Database design 如何在数据库设计中建模多个面向对象的组合关系?,database-design,database-schema,Database Design,Database Schema,我有两个表,它们可以提供一个相关的记录,表示由下面的类图近似建模的某些项。这是高度简化的,每个源都是各自独立的复合模型 从数据库而不是OOP的角度考虑,items表包含任何可能项的记录。如果您想知道小部件的定义是什么或gewgaw的定义,这就是item表的用途。Source*表表示物理项的位置类型,每条记录表示一个特定的位置。源*表还包含大量不相交的信息 widget或gewgaws的特定实例的集合包含在源代码中,即Source1有10个不同的widget和3个不同的gewgaws,而Sour

我有两个表,它们可以提供一个相关的记录,表示由下面的类图近似建模的某些项。这是高度简化的,每个源都是各自独立的复合模型

从数据库而不是OOP的角度考虑,items表包含任何可能项的记录。如果您想知道小部件的定义是什么或gewgaw的定义,这就是item表的用途。Source*表表示物理项的位置类型,每条记录表示一个特定的位置。源*表还包含大量不相交的信息

widget或gewgaws的特定实例的集合包含在源代码中,即Source1有10个不同的widget和3个不同的gewgaws,而Source2目前可能只包含1个不同的widget

为了表示这种关系,如果只有一个源表存在,我通常会使用源id和项id作为外键的透视表

关于如何表示第二种类型的存储,我的第一个想法是创建另一个透视表,即item_source2,然后当我需要统计总库存数量时,在item_source1和item_source2之间执行并集

这似乎不是特别优雅,而且引入了一个可能不需要的联盟

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

从编程的角度来看,我可以创建逻辑来测试和实施这个设计,但我很清楚这不是最佳实践,但我看不到如何通过数据库设计来解决这个问题


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

根据philipxy的建议,我猜您应该实现如下内容:

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

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

+----------------+
|shared relation |
+----------------+
+ FK myKey       + <--- references "source"
+ other attribs  +
+----------------+
+------------++------------+
|资料来源1 | |资料来源2|
+------------+   +------------+

+PFK mykey++PFK mykey+可能的重复我将对问题进行一些编辑以提高质量,不管它是否将结束,我将报告在我的最终实现中是否出现继承和组合之间的任何显著差异。在我的最后一条消息中,我想说,“两种定位的东西”。所以表相关(x,thing),thing(thing,p1,…),pocket_thing(thing,pt1,…)和shelf_thing(thing,st1,…)。链接的答案是关于子类型,而不是OO。也许我误解了。PS不会创建OO模型,然后简单地将其映射到关系数据库(尽管它是ORM所做的)这不是企业的关系设计,而是企业OO设计的关系设计。(关系设计是确定必要和足够的谓词/表来记录描述您的情况/状态的语句。)我想对此进行更新,但除了您的“虽然我可以根据DDL中给出的设计对其进行反向工程。虽然您的DDL实际上并不正确,但您可以明确地说“类似于”&“某种[…]”,这很有帮助?“。虽然给出更少的单词加上DDL更好,但应该是DDL,并添加清晰完整的句子重新约束,而不要在不需要时通过称它们为FKs或PKs来歪曲它们。使用足够多的单词、句子和引用部分例子。避免对“分型”的含义产生先入为主的偏见,以便在分型习语可以应用的时候。如果我们有子集,那么我们就有子类型。您的业务子集/类型根据其所在的源、根据其持有的源以及根据其所在的源等等。任何FK都涉及一个子类型。根据我的第一条评论,这是一个“FKs到多个表”作为“子类型”的反模式的情况。(谷歌)祝你好运。如果你不把我资本化的话,我可能会把这个投上去。(谢谢你逗我笑。)