2010-01-09 50 views
0

我目前正在考虑“朋友”表(多对多,存储用户之间的友谊)的数据库设计。MySQL表格设计:主要外国多列键可能吗?

列:user_id friend_id

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

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

回答

1

数据库在这方面努力,最快的方式可能是

PRIMARY KEY ('user_id', 'friend_id') 

这保证了他们独特的组合,并在同一时间既可以是外键。 也许你也想在user_id上找到一个索引,这样你就可以快速查找所有的朋友给一个用户。

INDEX ('user_id') 

没有必要拥有代理键​​,因为它会创建与维护表相关的额外工作。无论如何,这些组合都是独一无二的,而且你已经知道两个有问题的ID。

+0

是否有自动生成的外键索引? – Psaniko 2010-01-09 17:43:45

+0

也许。但不伤害具体。 – 2010-01-09 17:44:21

+0

也许“friend_id”上的索引更重要。 PK声明将按照该顺序产生“user_id”和“friend_id”的索引,并且在查找特定的user_id时将使用该组合索引。但是在friend_id上查找需要单独的索引。 – 2010-01-11 15:22:49

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) 
); 
0

我会去单列代理键(friendship_id),加上独特的约束和对user_idfriend_id组合的指数。为了保持一致性,我会使用代理键,因为您似乎在其他表上使用代理(user_id大概是指id列上的user等)。

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。