繁体   English   中英

MySQL-存储用户所在的组

[英]MySQL - Storing groups the user is in

我有一个网站,将用户分配给组,每个用户可以有无限个组。

例:

用户A:

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

用户B

  • 足球组
  • 国际象棋集团

目前,我的表结构如下:

表: login

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

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

还是将组完全存储在新表中会更好?

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

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

希望有一种比serialise更好的方法。

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

成员资格表(称为“交集实体”)具有其他两个表的主键(即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的组合主键确保一个给定的人只能属于一个给定的组一次; 如果稍后再尝试查询表,则忽略这一点可能会导致一些非常奇怪的问题。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM