【问题标题】:Database Design: need composite key + foreign key数据库设计:需要复合键+外键
【发布时间】:2011-07-01 09:39:08
【问题描述】:

我有 2 个具有 1-M 关系的表:

TABLE foo
 - foo_id (PK)
 - foobar_id
 - value

TABLE bar
 - bar_id (PK)
 - foo_id (FK to foo.foo_id)
 - foobar_id
 - value

我想确保foo.foobar_idfoo.value 是唯一的,因此想将它们设为复合键。如果我这样做,那么我可能可以摆脱foo.foo_id。如果我这样做,我如何关联foobar

我还希望bar.foo_idbar.foobar_id 是唯一的,但是如果我删除foo.foo_id 会遇到问题。

关于如何建模的建议?

【问题讨论】:

  • 只是让它们独一无二而不进行PK?
  • @zerkms - 如果我让两列都唯一,这是否意味着它们作为一对是唯一的,还是意味着单独的列必须是唯一的?
  • 如果您创建涵盖两个字段的UNIQUE 索引 - 那么这对应该是唯一的。
  • 谢谢。我没有意识到这一点。能否请您给出答案,以便我接受?

标签: mysql database database-design


【解决方案1】:

只需创建一个涵盖这两个字段的唯一索引。在这种情况下,只允许唯一的对。

【讨论】:

    【解决方案2】:

    我还希望 bar.foo_id 和 bar.foobar_id 是唯一的,但是如果我删除 foo.foo_id 会遇到问题。

    您可以拥有唯一键,但它们不是主键。您还可以拥有复合唯一键或主键。您可以创建任意数量的索引,除了主索引之外的任何种类。

    就 SQL 而言,您不会遇到问题,但您可能会遇到已经使用这些表的人员/代码。

    如果我这样做,我该如何关联 foo 和 bar?

    看起来您已经在 bar 中拥有 foobar_id - 您可以将其设为 foo 中 foobar_id 的外键。

    如果这不起作用,那么您可能需要在两者中保留 foo_id 只是为了建立关系。这是 id 的主要用途。仅供参考,如果 id 是 int 它占用的空间非常小,几乎不需要担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多