MS SQL创建带有连接表的多对多关系

40

我正在使用微软SQL Server管理工具,在创建连接表时,是否应该为连接表创建一个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个回答

76

我会使用第二个连接表:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

主键将是这两列的组合。你还需要在每个列上有一个对电影类别表的外键。

连接表将类似于这样:

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

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


1
我会做同样的事情。添加第三列可以使重复记录成为可能。 - Dan Bracuk
在这种情况下,是否有必要创建一个复合主键? - Harry .Naeem
@Harry.Naeem 如果你不这样做,那么你很容易在表中出现重复记录。我想你不会希望出现这种情况。 - Taryn
@bluefeet 我已经创建了一个包含两个外键的表,我应该在 SQL Server 中选择它们并将其设置为主键吗? - Harry .Naeem
@Harry.Naeem 如果不了解所有细节,我只会猜测,所以我建议您发布一个新问题,并提供您的表结构详细信息,可能还有一些示例数据。您可能会从中获得更清晰的答案,而不是通过我的猜测来了解您当前的设置。 - Taryn

23
有不同的观点。一派喜欢包含一个主键并将链接表命名为比仅连接两个表更有意义的名称。理由是尽管该表可能开始看起来只是一个链接表,但它可能成为具有重要数据的独立表。
例如,杂志和订阅者之间的多对多关系。实际上,该链接是一个订阅,拥有自己的属性,如到期日期、付款状态等。
然而,我认为有时链接表只是链接表。类别之间的多对多关系就是一个很好的例子。
所以在这种情况下,不需要单独的一字段主键。你可以有一个自动分配的键,这样做不会有任何问题,并且删除特定记录会更容易。作为一般规则,这可能是很好的,这样如果表后来发展成具有其自己的重要数据(如订阅),它将已经有一个自动分配的主键。
你可以在两个字段上放置唯一索引以避免重复。即使你有一个单独的自动分配键,这也可以防止重复。你可以使用两个字段作为主键(这也是一个唯一索引)。
因此,一种思路可以坚持整数自动分配的主键,并避免复合主键。这不是唯一的方法,也可能不是最好的方法,但它不会让你陷入一个你真正后悔的问题。
但是,对于像你正在做的这样的事情,只使用两个字段可能足够了。我仍然建议将两个字段作为复合主键,或者至少在两个字段上放置唯一索引。

4

我会选择第二个连接表。但是请将这两个字段设为主键。这样可以防止重复项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接