用于链接两个长距离表的外键或空值

时间:2017-09-23 20:19:14

标签: database database-design eloquent relational-database laravel-eloquent

考虑以下数据库示例:

https://developer.android.com/guide/topics/resources/layout-resource.html#idvalue

  • clinic有许多articles
  • supplierarticle之间的关系是多对多((1,n) - (1,n))

    我们说我有clinic's id,我想要检索所有suppliers,这是最好的方法吗?是通过在"null" article中为每个供应商创建article_supplier还是在foreign key中创建引用相应supplier的{​​{1}}?

后一种解决方案可能看起来最简单,最简单但是当有一大堆表时会发生什么?每次我需要一个列表时,我会不断添加外键吗?例如:

  • 诊所使用的药物清单
  • 医生给出的处方清单
  • ...

如果它有所作为,我正在使用Laravel的Eloquent ORM

2 个答案:

答案 0 :(得分:1)

表格表示值之间的关系。 (某些值标识实体。)在我们被告知每个表 - 基础或查询结果 - 意味着:它的行满足哪些业务/应用程序关系之前,不能使用数据库。 (即,它的(特征)谓词是什么。)你的桌子有什么关系?

要查询我们用基本关系表达关系,然后根据相应的基表表达其表。例如,连接返回满足一个关系另一个关系的行。因此,我们需要了解表格在业务/应用程序方面的关系。

基数&考虑到可能出现的情况,约束是关系的属性。它们不需要更新或查询。他们可以指导设计和用于诚信。

当诊所给你谈论“它的”供应商时,你没有说出你的意思。 “有”,“它”,“用于”,“引用”,“适当” - 都意味着没有 - 它们指的是相关实体,但它们并没有说它们如何与业务/应用程序相关。这种设计在诊所和诊所之间没有明确的关系。文章。如果确实如此,你就没有说过什么我们可以将正确的行放入或看到行和&了解情况。然而,您可以获得诊所供应商行,其中供应商“为”给定诊所“拥有”的某些文章。但这是你的意思吗?例如,如果您想要诊所允许对某些文章“拥有”供应商,那么这是一个新的关系/表格,不能从您拥有的内容中获得。

  

在article_supplier

中为每个供应商创建一个“null”文章

这种关系/表是article_supplier&的某种组合。刚刚描述的关系/表。但只有这两个就更简单了。

  

在供应商中创建引用相应诊所的外键

这意味着如果供应商“拥有”多个诊所,那么新版本中的行可能只有所有其他列不同; 规范化理论认为这比原始设计和clin_supplier关系/表更糟糕。这意味着,如果供应商“没有”诊所,您将需要类似可以为空的FK(外键)。

所以你可能想要一个clinic_supplier表。但您应该发布一个新问题,其中您实际上说的是您正在谈论的业务/应用程序关系。

你的问题&以下几乎是重复的,显然适用于回答它们的基本原则/概念都是相同的:
How do I find relations between tables that are long-distance related?
Required to join 2 tables with their FKs in a 3rd table
Best Solution - Ternary or Binary Relationship

您需要阅读信息建模&数据库设计教科书。

答案 1 :(得分:1)

在你的设计中: 供应商是一张桌子。 文章是一张表。 由于供应商提供文章,他们的关系用表格链接表示。因此,有一个supplier_article表。

诊所是一张桌子。 你提到Clinic使用的文章。 按照与上述相同的原则,临床与物品之间的关系应以表格的形式表达。这应该是 clinic_article 表。

虽然您还没有提及,但您必须查看出现的其他依赖项。例如,诊所执行程序和程序使用文章。

  

通过在供应商中创建引用相应的外键   诊所

这将假设一个供应商只能永久地提供给一个诊所。即使今天这是真的,明天也不会成为现实,因为您可能想要在同一地点或使用相同的应用程序或数据库规划多个诊所。