我有一个将用户分配到组的网站,每个用户可以在无限数量的组中。
示例:
用户A:
- 国际象棋组
- 弦乐团
- 篮球组
用户 B
- 足球组
- 国际象棋组
目前我的表结构如下:
表:登录
- id(自增)
- 用户名
- 密码
我正在考虑通过在表 login
中添加一个新行来存储 PHP serialise
数组。但是,编辑用户组会很困难,因为我必须将其反序列化然后再次序列化。
或者将组完全存储在一个新表中会更好吗?
存储每个用户所属组的最快和最有效的方法是什么?
此方法在更新组时需要简单,在查询时也需要快速。
希望有比serialise
更好的方法。
最佳答案
您所描述的称为多对多关系(每个组有多个成员,每个人都是多个组的成员。)通常的方法是为组创建第二个表,索引为一个唯一的组 ID 并存储有关每个组的所有信息, 成员资格除外,以及第三个成员资格表。
成员资格表(称为“交叉实体”)将其他两个表的主键作为其列,即 login_id
和 group_id
。它的主键将是其两个列 (PRIMARY KEY (login_id, group_id)
) 的串联,并且其每个列也将是引用其他表之一的外键。
这种情况是众所周知的,也是经过深入研究的,实际上是您开始研究数据库表规范化时学到的第二件事。
一个例子可能是
CREATE TABLE login
(
id INT AUTO_INCREMENT,
username VARCHAR(255),
password VARCHAR(255),
-- other columns go here
PRIMARY KEY (id)
);
CREATE TABLE groups
(
id INT AUTO_INCREMENT,
name VARCHAR(255),
description TEXT,
-- other columns go here
PRIMARY KEY (id)
);
CREATE TABLE membership
(
login_id INT,
group_id INT,
-- possibly more columns, or perhaps not
PRIMARY KEY (login_id, group_id),
CONSTRAINT member_user FOREIGN KEY (login_id) REFERENCES login (id),
CONSTRAINT member_group FOREIGN KEY (group_id) REFERENCES groups (id)
);
membership
的外键确保用户不能成为组的成员,除非用户和组都已经存在。 membership
的复合主键确保给定的人只能属于给定的组一次;忽略这一点可能会在您稍后尝试查询表时导致一些非常奇怪的问题。
希望对您有所帮助。
关于MySQL - 存储用户所在的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660332/