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

标签 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

[并且就保留它,没有主键或身份表]?

最佳答案

我会使用第二个连接表:

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 .

使用这两个字段作为主键将防止将重复的电影/类别组合添加到表中。

关于sql - MS SQL 使用连接表创建多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14676342/

相关文章:

sql-server - 使用 SMO 重新启动 SQL Server 实例

sql-server - 尝试将 Amazon EC2 上的 SSRS 连接到 Amazon RDS MSSQL 时出现权限错误

python - 使用 SQLAlchemy 添加多对多关系

hibernate - JPA/Hibernate 中 key 'PRIMARY' 的重复条目

sql - Oracle - 扩大数组定义

mysql - 如何在 Laravel 中运行此 SQL 查询?

mysql - SELECT ... IN 复制结果集中的记录?

sql - 给定一个列名,我如何找到数据库中的哪些表包含该列?

c# - 如何设计这个用于SQL搜索的算法?

database - 没有中间表的多对多 - 这可能吗?