【问题标题】:What foregin key relations should I use in my situation? having a hard time understand我应该在我的情况下使用什么外键关系?很难理解
【发布时间】:2014-01-09 04:19:40
【问题描述】:

我很难理解何时使用识别或非识别关系。我已经在这里阅读了一些关于 SO 的答案,但我仍然感到困惑。我想我就是那么慢......

所以我在我的 ER 图中添加了一张图片 - 一小部分 - 包含饮料配方:

我的明显问题是;如果有的话,这些关系中的哪一个应该被识别? - 为什么?

如您所见;我只有one-to-many non-identifying relationship - 这让我觉得我一定做错了什么 - 但它确实有效。

glasswarerecipes之间的关系例如:
每个食谱都需要一个玻璃杯——这意味着没有玻璃杯就不可能存在一个食谱——我猜。所以我将recipes.fk_glassware_id设置为NN,并且给定的id必须对应glassware-table中的一个id。 (一个玻璃杯可以跨越多个食谱,因此one-to-many)。但它应该是一种确定的关系吗?

recipes_rel_tagsrecipes- 和 tags-tables 之间的关系呢?这些中的任何一个都应该被确定为关系吗?如果没有任何链接表,则此表中的任何条目都不能存在..

编辑:
我添加了我的图表的新图片。现在,当我将关系更改为 identified 时,我的 _rel_-tables 中的 fk_ 看起来像主键 - 全部都是主键。
这是什么意思?

【问题讨论】:

    标签: mysql entity-relationship


    【解决方案1】:

    我不确定您是否看过这个问题的答案:What's the difference between identifying and non-identifying relationships?。我不确定我能做得比这更好,但也许我可以让它更具体地适用于您的示例。

    考虑识别关系的方法是问自己:我是否想要将孩子与父母分开?如果你愿意,这不是识别关系。我引用的答案使用了人​​与电话号码的关系。您不会创建一堆电话号码,然后将它们与人联系起来(至少在通常的用例中不会)。在您的情况下,您可能会创建食谱并决定以后对它们最好的玻璃器皿是什么(这将使其成为可选的非识别关系),或者您可能要求在创建时选择一些玻璃器皿(强制性的非识别关系)。但是,您以后也可能会添加到您的玻璃器皿表中(例如...有凹槽和无柄酒杯),然后更改一些食谱以使用它们而不是标准酒杯...所以这绝对不是一种识别关系。

    你还问:

    recipes_rel_tags 和 recipes- and tags-tables 之间的关系如何。这些中的任何一个都应该被确定为关系吗?如果没有任何链接表,则此表中的任何条目都不能存在..

    对!如果没有配方和标签中的记录,您永远不会在 recipes_rel_tags 中创建记录。因此它有 2 个标识关系。

    【讨论】:

    • 所以我将关系更改为identifying。现在看来我有更多的PK..我可能误解了..我在第一篇文章中添加了一张新图片。
    • 没错。如果您希望它们被识别,它就会成为复合主键的一部分。在通常的实践中,人们经常在这种情况下创建外键。您现在深入“技术上正确”的领域,这是许多数据库设计甚至没有考虑的细节。
    • 所以;在这种情况下,我可以在这些_rel_-tables 中省略id 吗? - 并根据等于两个外键组合的查询值查询特定行?如果是这样。那么 SQL 语句是什么样子的呢?
    • 不,表格看起来是正确的。那些ids 一起形成一个compound key
    • 我必须对此进行更多研究。我认为可能只有一个相同PK 的实例。 fk_recipes_idfk_tags_idrecipes_rel_tags-table 在我的情况下会出现多次 - 但如果它们被数据库/表一起读取(复合)它们就不会出现..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-02-13
    相关资源
    最近更新 更多