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

时间:2013-07-19 14:03:24

标签: php mysql list database-design

我对数据库设计有一点疑问:

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

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

在一个群组中,用户可以是“总统”(只有一个)或“监票人”(几个)

因此,在“组”表中,将有一个“总统”字段,其中包含总统用户ID。 我需要一个“监票人”字段,其中包含监票人ID列表。

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

分隔

制作另一张桌子似乎很奇怪,因为它只是该网站的一小部分。

你会如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

  

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

分隔

不要这样做。见Is storing a delimited list in a database column really that bad?

  

制作另一张桌子似乎很奇怪,因为它只是该网站的一小部分。

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

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

答案 1 :(得分:3)

假设用户可以属于多个组,您最终会得到多对多关系。这通常通过创建关联表来解决。

Groups
id, name

Users
id, email, etc.

Users_Groups
group_id, user_id

答案 2 :(得分:1)

就像有些人说过的那样,它有很多,所以你需要的是一个中间表来存储用户与组之间的关系。用户所属的每个组都是中间表中的一个条目 - 我称之为“成员资格”,这是我存储会员类型的地方。 Presidency等描述了用户与组的关系,因此成员资格表是存储的合理位置。

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

与您的架构比较 - 获取群组总裁的ID

SELECT PresidentID FROM Groups WHERE GroupID=...

为:

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

或同一查询,仅针对IsScrutineer=TRUE - 返回所有UserID的{​​{1}}。然后,迭代成员变得更加简单,不涉及解析。

Scrutineers