【问题标题】:Database design for multi level users with rails使用 Rails 为多级用户设计数据库
【发布时间】:2011-12-10 11:24:57
【问题描述】:

我有一个用户数据库表,其中包含 密码、电子邮件 等常用字段。还有一个名为 level 的字段定义了用户级别,例如 member编辑器管理员

还有一些特定于成员、编辑和管理员的字段,其他人不需要。所以我认为我应该为用户类型创建单独的表。

这就是问题所在; 如果我想遵循 Rails 的方式,我应该如何解决这个问题? 在数据库设计和关联方面。

【问题讨论】:

  • 您应该更具体地了解您的需求。那些额外的字段是什么?你认为你以后会需要更多的“角色”吗?一个用户可以同时拥有多个“角色”吗?乍一看,我会说为不同的用户类型创建多个表是一个坏主意:用户就是用户,无论其类型如何,您最终可能会在不同的表上出现重复项。另一个建议是查看一些authorization gems 以寻求灵感。
  • 我也不想为用户使用多个表,但用户类型需要 points 字段来执行某些操作,而其他用户类型则不需要,另一个用户类型必须与 room 表关联但其他用户类型.因此,在他们不需要时为每个用户创建room_id,这对我来说似乎有点不对劲。 points 字段也是如此,对吧?那么在这种情况下我应该使用多个表吗?

标签: ruby-on-rails database-design associations


【解决方案1】:

您似乎正在寻找基于角色的授权系统,以及每个角色的特定属性。实现此目的的一种方法是使用如下所示的数据模型:

.-------.1    *.------------.*     1.-------.
| users |<-----| user_roles |------>| roles |
'-------'      '------------'       '-------'
                     |
     .---------------+---------------------.
     |0..1           |0..1                 |0..1
 .--------.  .----------------------.  .----------.
 | points |  | some_other_attribute |  | room_ids |
 '--------'  '----------------------'  '----------'

这样,如果从用户中删除该角色(通过级联删除),您可以确保删除与特定角色相关的所有属性。

不过,您必须确保所有属性模型都执行如下验证规则:

class Point < ActiveRecord:Base
    validates :relevant_association?

  def relevant_association?
    user_role.role.title == "Admin"
  end
end

如果您的用户只能拥有一个角色,您可以通过在模型上添加role 字段来简化此操作,然后在可选属性(即belong_to 用户)上相应地编写验证规则。尽管如此,前一种模式为未来的调整提供了更大的潜力(创造一个新角色就是创造一个新记录)。

虽然我不是这方面的专家,所以你也可以继续寻找灵感; declarative_authorization gem 提供了您可能会感兴趣的数据模型的解释:

                     includes                   includes
                      .--.                        .---.
                      |  v                        |   v
.------.  can_play  .------.  has_permission  .------------.  requires  .----------.
| User |----------->| Role |----------------->| Permission |<-----------| Activity |
'------' *        * '------' *              * '------------' 1        * '----------'
                                                    |
                                            .-------+------.
                                         1 /        | 1     \ *
                               .-----------.   .---------.  .-----------.
                               | Privilege |   | Context |  | Attribute |
                               '-----------'   '---------'  '-----------'

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多