如何构建我的数据库?

时间:2009-11-22 20:59:09

标签: database-design

我的应用程序基本上是一种群组管理内容的方式。

将有3个不同级别的用户:

  • 网站管理员:一些可以做任何事情的人。
  • 群组管理员有权上传文件,编辑日历和管理会员,但仅适用于他们的群组。
  • 会员可以查看其所属群组的内容。

群组管理员应该能够从群组中删除成员。无论用户级别如何,任何人都可以成为组的成员,并且可以同时成为多个组的成员。

令我困惑的部分是如何跟踪成员可以参与的多个组。

我应该如何构建数据库以便实现这一目标?

到目前为止,这是我的想法:

//pseudo code:

users
    ( id , username , password , role ) //role within website

groups
    ( id , name )

group_members
    ( group_id , user_id , role ) //role within group

group_members VALUES
    ( 1 , 1 , 'group admin'  )
    ( 1 , 2 , 'group member' )
    ( 2 , 2 , 'group member' )

这是我应该如何追踪群组成员资格吗?

5 个答案:

答案 0 :(得分:1)

似乎结构比较合理。但是,也许我会将文本角色字段替换为单独的ROLE表,或者用表示角色的整数替换。

group_members
  (group_id, user_id, role_id)

role
  ( role_id, name)

 group_members VALUES
    (1, 1, 1)  
 role 1 => group admin
 role 2 => group member

etc.

答案 1 :(得分:1)

USERS

  • user_id,pk
  • username
  • password

ROLES

  • role_id,pk
  • role_name

GROUPS

  • group_id,pk
  • group_name

USER_GROUP_ROLES_XREF

  • user_id,pk,fk
  • role_id,pk,fk
  • group_id,pk,fk

USER_GROUP_ROLES_XREF表的主键是复合键 - 这意味着确保用户每个组只能有一个角色,因为只允许一个记录与值组合使用。并且由于所有三个值的组合,用户可以参与多个组。

答案 2 :(得分:0)

对我来说很好,虽然我使用int id来表示'group member'或'group admin'(而不是文本)。换句话说,有另一个表示用户类型的表,并且该表中的id将在group_members中分配。

如果只有一个组管理员,另一种方法是将用户ID放入组表中,表示组的管理员。但是,这会将您锁定为始终具有单个组管理员。

答案 3 :(得分:0)

我将您的角色字段更改为布尔值或ENUM(“Y”,“N”)类型的东西并将其称为“is_admin” - 但除此之外它看起来不错

答案 4 :(得分:0)

我会做一些改变:

//伪代码:

用户     (id,username,password,id_role)//网站内的角色

users_role     (id,role)

基     (id,name)

group_members     (group_id,user_id,id_group_role)//组内的角色

group_role     (id,role)

group_members VALUES     (1,1,1)     (1,2,2)     (2,2,2)