MS SQL与联结表创建多对多关系

时间:2013-02-03 19:28:07

标签: sql sql-server many-to-many junction-table

我正在使用Microsoft SQL Server Management Studio,在创建联结表时,我应该为联结表创建一个ID列,如果是这样,我还应该将其作为主键和标识列吗?或者只为我加入多对多关系的表保留2列?

例如,如果这是多对多的表:

MOVIE
Movie_ID
Name
etc...

CATEGORY
Category_ID
Name
etc...

我应该制作联结表:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID

[并使Movie_Category_Junction_ID我的主键并将其用作标识列]?

或者:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

[并且只留下没有主键或身份表的那个]?

3 个答案:

答案 0 :(得分:48)

我会使用第二个联结表:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

主键是两列的组合。您还需要从每列到MovieCategory表的外键。

联结表看起来与此类似:

create table movie_category_junction
(
  movie_id int,
  category_id int,
  CONSTRAINT movie_cat_pk PRIMARY KEY (movie_id, category_id),
  CONSTRAINT FK_movie 
      FOREIGN KEY (movie_id) REFERENCES movie (movie_id),
  CONSTRAINT FK_category 
      FOREIGN KEY (category_id) REFERENCES category (category_id)
);

请参阅SQL Fiddle with Demo

将这两个字段用作PRIMARY KEY可防止将重复的电影/类别组合添加到表格中。

答案 1 :(得分:16)

对此有不同的思想流派。一所学校更喜欢包括一个主键,并将链接表命名为比它链接的两个表更重要的东西。原因是虽然表可能看起来只是一个链接表,但它可能会成为自己的表,其中包含大量数据。

一个例子是杂志和订阅者之间的多对多。实际上,该链接是具有自己属性的订阅,如到期日期,付款状态等。

但是,我认为有时链接表只是一个链接表。与类别的多对多关系就是一个很好的例子。

因此,在这种情况下,不需要单独的一个字段主键。你可以有一个自动分配键,它不会伤害任何东西,并且会使删除特定记录更容易。它可能是一般的做法,所以如果表后来发展成一个具有自己的重要数据(作为订阅)的重要表,它将已经有一个自动分配主键。

您可以在两个字段上放置唯一索引以避免重复。如果您有一个单独的自动分配键,这甚至可以防止重复。您可以将这两个字段用作主键(也是唯一索引)。

因此,一种思想可以坚持使用整数自动分配主键,并避免使用复合主键。这不是唯一的方法,也许不是最好的方式,但它不会导致你的错误,成为你真正后悔的问题。

但是,对于你正在做的事情,你可能只对这两个领域很好。我仍然建议将两个字段作为复合主键,或者至少在两个字段上放置一个唯一索引。

答案 2 :(得分:1)

我会选择第二个交汇处。但是将这两个字段作为主键。这将限制重复的条目。