首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MS SQL使用连接表创建多对多关系

MS SQL使用连接表创建多对多关系
EN

Stack Overflow用户
提问于 2013-02-04 03:28:07
回答 3查看 84K关注 0票数 35

我正在使用Microsoft SQL Server Management Studio,在创建连接表时,我是否应该为该连接表创建一个ID列,如果是,我是否也应该将其设置为主键和标识列?或者只为多对多关系中要连接的表保留两列?

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

代码语言:javascript
运行
复制
MOVIE
Movie_ID
Name
etc...

CATEGORY
Category_ID
Name
etc...

我是否应该制作连接表:

代码语言:javascript
运行
复制
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID

并将Movie_Category_Junction_ID设置为我的主键并将其用作标识列?

或者:

代码语言:javascript
运行
复制
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

没有主键或标识表就这样了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-04 03:32:43

我将使用第二个连接表:

代码语言:javascript
运行
复制
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

主键将是两列的组合。您还可以从MovieCategory表的每一列获得一个外键。

连接表将如下所示:

代码语言:javascript
运行
复制
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将防止将重复的电影/类别组合添加到表中。

票数 67
EN

Stack Overflow用户

发布于 2013-02-04 03:58:44

关于这一点,有不同的思想流派。一所学校更喜欢包括一个主键,并命名链接表,而不仅仅是它正在链接的两个表。原因是,尽管表一开始看起来只是一个链接表,但它可能会成为包含重要数据的自己的表。

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

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

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

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

因此,一个学派可以坚持整数自动分配主键,并避免复合主键。这不是唯一的方法,也可能不是最好的方法,但它不会把你引向错误,陷入你真正后悔的问题。

但是,对于您正在做的事情,您可能只需要这两个字段就可以了。我仍然建议让这两个字段成为复合主键,或者至少在这两个字段上放置一个唯一索引。

票数 22
EN

Stack Overflow用户

发布于 2014-10-23 22:46:10

我会选择第二个连接表。但将这两个字段作为主键。这将限制重复条目。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14676342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档