MySQL表设计:主外部多列密钥可能吗?

时间:2010-01-09 17:28:58

标签: mysql database-design foreign-keys

我目前正在考虑“朋友”表的数据库设计(多对多,存储用户之间的友谊)。

列:user_id friend_id

更喜欢多列主键而不是额外的“friendship_id”列是否有意义?

如果是这样,我可以为两列添加外键吗?

4 个答案:

答案 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_idfriend_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。