我目前正在考虑“朋友”表(多对多,存储用户之间的友谊)的数据库设计。MySQL表格设计:主要外国多列键可能吗?
列:user_id friend_id
是否有意义喜欢多列主键,而不是额外的“friendship_id”列?
如果是这样,我可以为两列添加外键吗?
我目前正在考虑“朋友”表(多对多,存储用户之间的友谊)的数据库设计。MySQL表格设计:主要外国多列键可能吗?
列:user_id friend_id
是否有意义喜欢多列主键,而不是额外的“friendship_id”列?
如果是这样,我可以为两列添加外键吗?
数据库在这方面努力,最快的方式可能是
PRIMARY KEY ('user_id', 'friend_id')
这保证了他们独特的组合,并在同一时间既可以是外键。 也许你也想在user_id上找到一个索引,这样你就可以快速查找所有的朋友给一个用户。
INDEX ('user_id')
没有必要拥有代理键,因为它会创建与维护表相关的额外工作。无论如何,这些组合都是独一无二的,而且你已经知道两个有问题的ID。
是的,你确实可以创建两个外键列,这通常是这个关联的设计。您还可以指定两个列一起是唯一的,因此(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)
);
我会去单列代理键(friendship_id
),加上独特的约束和对user_id
,friend_id
组合的指数。为了保持一致性,我会使用代理键,因为您似乎在其他表上使用代理(user_id
大概是指id
列上的user
等)。
如果您需要跟踪友情事件,您可以拥有一个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。
是否有自动生成的外键索引? – Psaniko 2010-01-09 17:43:45
也许。但不伤害具体。 – 2010-01-09 17:44:21
也许“friend_id”上的索引更重要。 PK声明将按照该顺序产生“user_id”和“friend_id”的索引,并且在查找特定的user_id时将使用该组合索引。但是在friend_id上查找需要单独的索引。 – 2010-01-11 15:22:49