繁体   English   中英

mysql存储动态列表的最佳方法

[英]mysql best way to store dynamic list

我对数据库设计有一个小问题:

假设我有一个“(用户)组”表。 在此表中,存在一些基本字段,其中包含有关该组的信息(创建日期,名称等),以及一个应包含该组用户列表的字段。

我有一个“用户”表,其中包含有关用户的信息(真的吗?)。 该表未与组表链接,因为不强制用户具有组。

在一个组中,用户可以是“主席”(仅一个)或“监票员”(多个)

因此,在“组”表中,将有一个“总裁”字段,其中包含总裁用户ID。 而且我需要一个“ scrutineer”字段,其中将包含审查员ID的列表。

我不知道该如何处理这份清单。 也许将每个ID存储在一个文本字段中,并用一个字符(';'或'-')分隔...

制作另一个表似乎很奇怪,因为它只是站点的很小一部分。

您将如何解决?

我不知道该如何处理这份清单。 也许将每个ID存储在一个文本字段中,并用一个字符(';'或'-')分隔...

不要这样 请参阅在数据库列中存储定界列表真的那么糟糕吗?

制作另一个表似乎很奇怪,因为它只是站点的很小一部分。

这是代表多对多关系的正确,规范化的方法。

如果一个用户最多只能属于一个组(多对一关系),则可以将其组成员身份存储在users表中(如果该用户不在任何组中,则保留NULL列),并在其中标记一个决定他们的成员身份是president还是scrutineer ,或者假定他们是scrutineer除非他们也是groups表中的president 但是,在这种情况下,我可能仍然倾向于使用附加表并在user列上定义UNIQUE约束。

假设一个用户可以属于多个组,那么您将得到多对多关系。 通常可以通过创建关联表来解决。

Groups
id, name

Users
id, email, etc.

Users_Groups
group_id, user_id

就像有些人说的那样,它的数量很多,所以您需要一个中介表来存储用户与组之间的关系。 用户所属的每个组都是中间表中的一项,我将其称为“成员资格”,这是我存储成员资格的位置。 主席等描述了用户与组的关系,因此,成员资格表是存储的逻辑位置。

当您对稍微复杂一些的查询(例如联接)感到满意时,这种架构就不再那么令人生畏了

与您的架构进行比较-获取小组主席的ID

SELECT PresidentID FROM Groups WHERE GroupID=...

至:

SELECT UserID FROM Membership WHERE IsPresident=TRUE AND GroupID=...

或相同的查询,仅对于IsScrutineer=TRUE返回所有ScrutineersUserID 然后,遍历成员变得非常简单,无需进行解析。

User:
  UserID

Group:
  GroupID

Membership: (user is member of a group)
  GroupID
  UserID
  IsScrutineer
  IsPresident

暂无
暂无

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

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