[英]MySQL - Storing groups the user is in
我有一个网站,将用户分配给组,每个用户可以有无限个组。
例:
用户A:
用户B
目前,我的表结构如下:
表: login
我正在考虑通过在表login
新行来存储PHP serialise
数组。 但是,编辑用户的组将很困难,因为我必须先反序列化然后再次序列化它。
还是将组完全存储在新表中会更好?
存储每个用户所属组的最快 , 最有效的方法是什么?
此方法在更新组时需要简单,在查询时也必须快速。
希望有一种比serialise
更好的方法。
您所描述的是所谓的多对多关系(每个组都有多个成员,每个人都是多个组的成员。)通常的方法是为组创建第二张表,并按唯一组索引标识并存储除成员资格外的每个组的所有信息,以及用于成员资格的第三个表。
成员资格表(称为“交集实体”)具有其他两个表的主键(即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
的组合主键确保一个给定的人只能属于一个给定的组一次; 如果稍后再尝试查询表,则忽略这一点可能会导致一些非常奇怪的问题。
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.