MySQL - 存储用户所在的组

标签 mysql performance database-design

我有一个将用户分配到组的网站,每个用户可以在无限数量的组中。

示例:

用户A:

  • 国际象棋组
  • 弦乐团
  • 篮球组

用户 B

  • 足球组
  • 国际象棋组

目前我的表结构如下:

表:登录

  • id(自增)
  • 用户名
  • 密码

我正在考虑通过在表 login 中添加一个新行来存储 PHP serialise 数组。但是,编辑用户组会很困难,因为我必须将其反序列化然后再次序列化。

或者将组完全存储在一个新表中会更好吗?

存储每个用户所属组的最快最有效的方法是什么?

此方法在更新组时需要简单,在查询时也需要快速。

希望有比serialise更好的方法。

最佳答案

您所描述的称为多对多关系(每个组有多个成员,每个人都是多个组的成员。)通常的方法是为组创建第二个表,索引为一个唯一的组 ID 并存储有关每个组的所有信息, 成员资格除外,以及第三个成员资格表。

成员资格表(称为“交叉实体”)将其他两个表的主键作为其列,即 login_idgroup_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/

相关文章:

php - 我找不到此 SQL 错误的解决方案

c# - MySql如何创建用户并授予权限

mysql - 主键在 MySQL 中没有默认值

performance - 什么是 FLOP/s?它是衡量性能的一个很好的指标吗?

MySQL - 从平面表移动到第一范式

mysql - 创建表category_path opencart 1.5.6.4

performance - JMeter:高斯随机计时器与泊松随机计时器

c - 多线程 random_r 比单线程版本慢

mysql - MySQL 5.6中INNODB存储引擎是否提供默认分区修剪?

mysql - 数据库设计 - 条件空值