sc0*_*tbr 29 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...
Run Code Online (Sandbox Code Playgroud)
我应该建立联结表:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID
Run Code Online (Sandbox Code Playgroud)
[并制作Movie_Category_Junction_ID我的主键并将其用作标识栏]?
要么:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Run Code Online (Sandbox Code Playgroud)
[并且只留下没有主键或身份表的那个]?
Tar*_*ryn 50
我会使用第二个连接表:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Run Code Online (Sandbox Code Playgroud)
主键是两列的组合.您还可以从每列到Movie和Category表有一个外键.
联结表看起来类似于:
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)
);
Run Code Online (Sandbox Code Playgroud)
使用这两个字段PRIMARY KEY可以防止将重复的电影/类别组合添加到表中.
Mar*_*rce 17
对此有不同的思想流派.一所学校更喜欢包括一个主键,并将链接表命名为比它链接的两个表更重要的东西.原因是虽然表可能看起来像只是一个链接表,但它可能成为拥有重要数据的自己的表.
一个例子是杂志和订阅者之间的多对多.实际上,该链接是具有自己属性的订阅,例如到期日期,付款状态等.
但是,我认为有时链接表只是一个链接表.与类别的多对多关系就是一个很好的例子.
因此,在这种情况下,不需要单独的一个字段主键.你可以有一个自动分配键,它不会伤害任何东西,并且会使删除特定记录更容易.它可能是一般的做法,因此如果表后来发展成具有其自身重要数据(作为订阅)的重要表,则它将具有自动分配主键.
您可以在两个字段上放置唯一索引以避免重复.如果您有一个单独的自动分配键,这甚至可以防止重复.您可以将这两个字段用作主键(也是唯一索引).
因此,一种思想可以坚持使用整数自动分配主键,并避免使用复合主键.这不是唯一的方法,也许不是最好的方法,但它不会导致你的错误,成为你真正后悔的问题.
但是,对于你正在做的事情,你可能只对这两个领域很好.我仍然建议将两个字段作为复合主键,或者至少在两个字段上放置一个唯一索引.
| 归档时间: |
|
| 查看次数: |
61832 次 |
| 最近记录: |