MySQL表设计:主外键多列是否可能?

MySQL表设计:主外键多列是否可能?,mysql,database-design,foreign-keys,Mysql,Database Design,Foreign Keys,我目前正在考虑“friends”表(多对多,存储用户之间的友谊)的数据库设计 列:user\u id friend\u id 选择多列主键而不是附加的“Friendly_id”列有意义吗 如果是这样,我可以为这两列添加外键吗?是的,您确实可以创建两个外键列,这通常就是这种关联的设计方式。您还可以指定两列一起是唯一的,因此(user\u id,friend\u id)是唯一的 编辑:例如: CREAT TABLE friendship ( user_id INT, friend_i

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

列:
user\u id friend\u id

选择多列主键而不是附加的“Friendly_id”列有意义吗


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

是的,您确实可以创建两个外键列,这通常就是这种关联的设计方式。您还可以指定两列一起是唯一的,因此(user\u id,friend\u 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)
);

我想要一个单列代理键(
Friendly\u id
),加上唯一约束和
用户id
朋友id
组合上的索引。我会使用代理键来保持一致性,因为您似乎在使用其他表上的代理(
user\u id
可能指的是
user
上的
id
列等)。

如果您需要跟踪友谊事件,您可以拥有一个友谊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)
);

在由外键约束分别创建的两列上都会有一个索引,在用户id、朋友id上会有一个多列唯一索引。

数据库处理此问题的最快方法可能是

PRIMARY KEY ('user_id', 'friend_id')
这确保了它们是唯一的组合,同时两者都可以是外键。 也许你也需要一个关于用户id的索引,这样你就可以快速查找一个用户的所有好友

INDEX ('user_id')

不需要有代理键,因为它会创建与维护表相关的额外工作。无论如何,这些组合都是唯一的,并且您已经知道这两个id。

外键是否有自动生成的索引?可能有。但具体来说没有什么坏处。可能是“friend\u id”上的索引更重要的是,PK-dclaration将按顺序在“user\u id”和“friend\u id”上生成索引,并且在查找特定的user\u id时将使用该复合索引。但在查找friend\u id时需要单独的索引。这取决于相关的数据库引擎。