[英]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
返回所有Scrutineers
的UserID
。 然后,遍历成员变得非常简单,无需进行解析。
User:
UserID
Group:
GroupID
Membership: (user is member of a group)
GroupID
UserID
IsScrutineer
IsPresident
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.