是否应该使用一对一的关系,列或其他内容?

时间:2010-12-25 08:05:57

标签: sql ruby-on-rails normalization

虽然我的问题特别在Ruby on Rails中,但我也一般都会问:我有一个用户表,想要指定一些用户是学生,其他人是教师。在这种情况下,设计模式的最佳方法是什么?

编辑: 虽然我最初接受了冯康拉德的答案 - 它符合原始标准 - 我必须根据nhnb的反馈重新打开并调整问题。

如果学生和/或教师需要其他(独特)属性,应该怎么做?

2 个答案:

答案 0 :(得分:2)

在这种情况下,我只需要使用一个名为teacher的布尔列。如果是,则用户是教师。如果是假的,那就是学生。无需创建另一个模型。

如果您想要两个以上角色(例如,学生,教师,管理员,管理员(?)),您可以添加另一个名为UserGroup的模型。您还必须在名为user_group_id的用户表中创建一个列。在新模型中,每个角色都有一行。然后,您指定以下关系:

class User < ActiveRecord::Base
  belongs_to :user_group
end

class UserGroup < ActiveRecord::Base
  has_many :users
end

这样您就可以将每个用户分配到特定的组。

答案 1 :(得分:2)

这在很大程度上取决于教师和学生之间的不同属性的数量以及添加或删除新的唯一属性的频率。如果情况不同,那么你有两个选择:

  1. 制作两个模型,一个用于学生,一个用于教师,并使用ruby include来共享两个模型之间的任何逻辑。与用户关联的任何关联,您将使用多态关联(has_many :user, :polymorphic => true
  2. 将属性放在另一个表中。例如:您将拥有users表和user_attributes表。 users会有id, user_type, username, etc.user_attributes会有id, user_id, attribute_name, value
  3. 但是,如果您在两个用户之间的不同属性很少而且非常坚固,那么您应该考虑使用Single Table Inheritance

    祝你好运!