【问题标题】:Database theory - relationship between two tables数据库理论——两个表之间的关系
【发布时间】:2010-03-17 04:19:51
【问题描述】:

我有一个包含两个表的数据库 - 我们称它们为 Foo 和 Bar。每个 foo 可能与任意数量的 bar 相关,并且每个 bar 可能与任意数量的 foo 相关。我希望能够通过一个查询来检索与某个 bar 关联的 foo,以及与某个 foo 关联的 bar。

我的问题是,记录这些关系的最佳方式是什么?我应该有一个单独的表来记录每个关系(例如两列,foo 和 bar)吗? foo 表是否应该有一列用于显示条形列表,反之亦然?还有其他我忽略的选项吗?

【问题讨论】:

    标签: database-design many-to-many relational-database


    【解决方案1】:

    这称为多对多关系。 “标准”解决方案是设置第三张表,其中每个表的主键位于存在关系的每一行中。

    第三个表称为联结表。来自维基百科的“连接表”:http://en.wikipedia.org/wiki/Junction_table

    举个例子:

    Foo
    UID
    Col1
    Col2
    
    Bar
    UID
    Col1
    Col2
    
    Foo_Bar
    UID
    Foo_UID
    Bar_UID
    

    因此,在上面,可能有许多 foo 和许多 bar。与 bar 相关的每个 foo 以及与 foo 相关的每个 bar 都将存在于 Foo_Bar 表中。要获取与给定 bar 相关的所有 foo,您可以使用以下 SQL:

    select *
    from foo
    where uid in (
        select foo_uid
        from foo_bar
        where bar_uid=<some bar uid>)
    

    (没有发现这个问题的任何确切骗局,但以下问题扩展了该主题。)

    Many to many table design question
    Many to Many Relation Design - Intersection Table Design

    【讨论】:

    • 1) 在关系术语中,如果它包含 only 父级的 PK,则它是一个 Associative 表,因为它解决了许多-对多关系;如果它包含其他数据,它是一个普通的“表”。不知道本周维基会如何称呼它。 2)除非你想要重复的行,否则PK是(Foo_UID, Bar_UID)。 3)Foo-Bar.UID是100%冗余的,一个额外的列和索引;它毫无用处;它可以被删除。
    【解决方案2】:

    这确实是多对多的关系。除了迈克尔的回答之外,我还想提供以下内容作为附加资源。我见过太多糟糕的数据库实现,所以没有提出来(不仅是为您,还有其他可能在未来查看此内容的人)

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多