1

我有一个关于数据库设计的小问题:

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

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

在一个组中,一个用户可以是“主席”(只有一个)或“监察员”(几个)

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

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

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

你会如何解决这个问题?

4

3 回答 3

7

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

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

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

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

如果用户最多只能在一个组中(多对一关系),您可以将他们的组成员身份存储在表中(如果用户不在任何组中,则users保留该列)并在该表中标记是否NULL他们的成员资格是 a presidentor scrutineer,否则假设scrutineer除非他们也在表中presidentgroups但是,在这种情况下,我可能仍然想坚持使用附加表并在列上定义UNIQUE约束。user

于 2013-07-19T14:04:52.573 回答
3

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

Groups
id, name

Users
id, email, etc.

Users_Groups
group_id, user_id
于 2013-07-19T14:07:04.333 回答
1

就像有人说的那样,它是多对多的,所以您需要一个中间表来存储用户与组的关系。用户所属的每个组都是中间表中的一个条目——我称之为“成员资格”,这是我存储成员资格的地方。Presidency 等描述了用户与组的关系,因此成员资格表是存储的逻辑位置。

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

对比你的架构——获取组长的ID

SELECT PresidentID FROM Groups WHERE GroupID=...

至:

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

或相同的查询,仅用于IsScrutineer=TRUE--returns UserIDof all Scrutineers。然后,迭代成员变得更加简单,不涉及解析。

User:
  UserID

Group:
  GroupID

Membership: (user is member of a group)
  GroupID
  UserID
  IsScrutineer
  IsPresident
于 2013-07-19T14:10:49.877 回答