【问题标题】:Modeling User, Group and Membership database tables建模用户、组和成员数据库表
【发布时间】:2011-12-29 23:23:16
【问题描述】:

我正在尝试按如下方式创建用户、组和成员表。一个用户可能属于一个或多个组,一个组可能有一个或多个用户。 User 和 Group 表之间的多对多关系是使用 Membership 表来维护的。我想维护会员状态(已批准/待定/其他??)和会员批准者信息。成员资格批准者将是管理员组中的用户之一。以下是我脑海中的粗略模式。我是数据库建模的新手,希望获得有关以下实施的一些反馈。特别是我不确定 Membership 表是否应该使用 'user_id' FK 有 'approved_by' 列,还是应该创建一个单独的表来维护 MembershipStatus(id, members_id, status,approved_by)?我猜这里有一个单独的表 MembershipStatus 更合适,但不确定。另外,我打算在这个应用程序中使用 ActiveRecord 作为 ORM。我感谢任何实施此设计/架构的 cmets 或建议。

User:
  id, Primary Key
  userid, Integer, Unique
  username, String, Unique
  email, String, Unique
  created_at, DateTime
  updated_at, DateTime

Group:
  id, Primary Key
  groupid, Integer, Unique
  groupname, String, Unique
  created_at, DateTime
  updated_at, DateTime

Membership:
  PK(user_id, group_id)
  status, String
  approved_by, user_id FK to User table 
  created_at, DateTime
  updated_at, DateTime

MembershipStatus 
  id
  membership_id FK to Membership table
  status, String
  approved_by, user_id FK to User table 
  created_at, DateTime
  updated_at, DateTime

-谢谢

【问题讨论】:

  • 为什么 ID 和 userID 以及 ID 和 GroupID 我看不出在每个表中保留 2 组 ID 的原因。您将 ID 字段隐藏起来,并向用户公开 Name 字段..
  • 如果用户离开会发生什么,您想保留会员历史或他们曾经是会员的事实吗?我想我会保留会员身份,使用 FK 到用户并将会员状态命名为 MembershipJRNL 以跟踪历史。我还会考虑一张包含所有不同类型的会员资格的表格。最后,如果不记录安全性,那么显示记录不再处于活动状态的“Deleted_at”怎么样?
  • userID 和 groupID 与 Linux 系统的用户和组数据库相关,因此我将其与数据库表中的 ID(主键)保持不同,这些表通常是连续递增的。系统用户/组 ID 可能没有相同的约定,因此我将它们分开。感谢您对审计这些账户的建议。我没有想过。我会考虑您和 Randy 的建议,稍后再重新发布我的架构。谢谢你们的cmets。

标签: database ruby-on-rails-3 postgresql activerecord schema


【解决方案1】:

看起来不错。

您在 2 个表格中显示了approved_by。如果您保留 MembershipStatus 表,那么这就是应该属于的地方。还有 - 名称“approved_by”暗示了“已批准”的状态,可能存在也可能不存在。你可能会想到另一个名字...

您还应该有一个表格,可以确定哪些用户是哪些组的管理员。这样,您就可以编写数据库端安全性代码,以确定谁被允许批准以及存储谁实际批准了。

另外,我不喜欢在表中存储审计历史,正如您所展示的那样。要么使用内置审计的数据库,要么将其拉出到另一个表来记录审计历史。

最后,id 和 userid 似乎是多余的。使用用户名。 (其他表类似)

【讨论】:

  • 感谢兰迪的回复。我不确定是否要添加单独的 MembershipStatus 表,这就是我感到困惑的地方 - 是否有单独的 MembershipStatus 表来维护状态和approved_by 或仅将其存储在 Membership 表中。如果我使用 MembershipStatus 表,那么我不会将 status 和approved_by 列添加到 Membership 表中。另外,感谢有关使用 GroupAdmin 类型表的建议。我在发布问题后立即考虑。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多