我目前正在考虑“朋友”表的数据库设计(多对多,存储用户之间的友谊)。
列:user_id friend_id
更喜欢多列主键而不是额外的“friendship_id”列是否有意义?
如果是这样,我可以为两列添加外键吗?
答案 0 :(得分:1)
是的,您确实可以创建两个外键列,这通常是这种关联的设计方式。您还可以指定两列一起是唯一的,因此(user_id,friend_id)是唯一的。
编辑:这方面的一个例子可能是:
CREAT TABLE friendship (
user_id INT,
friend_id INT,
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (friend_id) REFERENCES user(id),
UNIQUE(user_id,friend_id)
);
答案 1 :(得分:1)
数据库处理此问题的最快方法可能是
PRIMARY KEY ('user_id', 'friend_id')
这确保它们是唯一的组合,同时两者都可以是外键。 也许你想要一个user_id的索引,这样你就可以快速查找一个用户的所有朋友。
INDEX ('user_id')
不需要代理键,因为它会创建与维护表相关的额外工作。无论如何,这些组合是独一无二的,你已经知道了两个有问题的ids。
答案 2 :(得分:0)
我会选择单列代理键(friendship_id
)加上唯一约束和user_id
,friend_id
组合的索引。我会使用代理键来保持一致性,因为您似乎在使用代理项(user_id
可能是指其他表上的id
上的列user
)。
答案 3 :(得分:0)
如果您需要跟踪友谊事件,您可以拥有friendship_id(假设您想要一个列出系统中最新友谊的框,其中包含指向详细信息的链接),但如果您的数据模型不需要这种关系,多列主键就好了。你可以像这样创建它:
create table friend (
user_id int,
friend_id int,
foreign key (user_id) references user(id),
foreign key (friend_id) references user(id),
primary key (user_id, friend_id)
);
在外键约束下单独创建的两列上都有索引,在user_id上有一个多列唯一索引,friend_id。