【问题标题】:Should a one-to-one relation, column, or something else be used?应该使用一对一的关系、列或其他东西吗?
【发布时间】:2011-05-30 14:31:08
【问题描述】:

虽然我的问题专门针对 Ruby on Rails,但我还是一般性地问:我有一个用户表,希望将一些用户指定为学生,将其他用户指定为教师。在这种情况下设计架构的最佳方式是什么?

编辑: 尽管我最初接受了 vonconrad 的回答——它符合最初的标准——但我必须根据 nhnb 的反馈重新打开并调整问题。

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

【问题讨论】:

  • 这些角色在不久的将来需要额外的不同属性的可能性有多大?
  • @nhnb:虽然我现在可以不用它,但很可能在不久的将来会需要它。在这种情况下有更好的方法吗?

标签: sql ruby-on-rails normalization


【解决方案1】:

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

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

class User < ActiveRecord::Base
  belongs_to :user_group
end

class UserGroup < ActiveRecord::Base
  has_many :users
end

这将允许您将每个用户分配到一个特定的组。

【讨论】:

  • 我会假设你以后总会有更多的角色,以便在它发生时减轻一些痛苦,但仍然是一个很好的答案。 +1
  • 谢谢。毫无疑问,我将扩展到两个以上的角色,所以这非常有帮助。另外,我认为第二类应该是 UserGroup,对吗?
【解决方案2】:

这在很大程度上取决于教师和学生之间有多少不同的属性,以及添加或删除新的独特属性的频率。如果情况是它们会有很大差异,您有两种选择:

  1. 制作两个模型,一个用于学生,一个用于教师,并使用 ruby​​ include 在两个模型之间共享任何逻辑。任何与用户关联的关联,您都将使用多态关联 (has_many :user, :polymorphic =&gt; true)
  2. 将属性放在另一个表中。例如:您将拥有users 表和user_attributes 表。 users 将具有 id, user_type, username, etc.user_attributes 将具有 id, user_id, attribute_name, value

但是,如果您在两个用户之间的不同属性很少而且非常可靠,您应该考虑使用Single Table Inheritance

祝你好运!

【讨论】:

  • 非常有帮助,而且令人头疼。我认为,在这种特定情况下,我将使用单表继承。谢谢。如果有人遇到 link_to 和 form_for 的问题,我发现这篇博文有一个解决方法:code.alexreisner.com/articles/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多