我有多种用户帐户类型,每种类型都有不同的信息。例如,业务联系人链接到企业,学校管理员和学生链接到学校。学生有实际地址,但业务联系人和学校管理员使用组织地址。还有其他每种类型的信息。
我倾向于为学生,学校管理员和业务联系人提供单独的表格,但是使用Authlogic,我有一个带有身份验证信息的Users表(都需要登录)。
问题是如何最好地将此单一身份验证表与各个配置文件相关联。似乎一对一的关系需要单个表格(例如,用户< - >学生或用户< - > Business_contacts)。我想要一些“一对一”的关系(用户< - > Students 或 Business_contacts)。有没有一种使用连接表或其他构造的好方法?
或者,我可以统一Users表中的公共信息,并在XML中提供“profile”列以支持唯一信息。我的想法是将所有内容保存在干净的DB列中会简化选择/插入。
思想,想法?
答案 0 :(得分:5)
业务联系人链接到企业,学校管理员和学生链接到学校。
这意味着您拥有不同的角色用户,而不是不同的用户。
学生有实际地址,但业务联系人和学校管理员使用组织地址 还有其他每种类型的信息。
这意味着不同的角色具有不同的数据和行为,导致不同的OO类。
问题是如何最好地将此单一身份验证表与各个配置文件相关联。 我想要一些“一对一的”关系(用户< - > Students或Business_contacts)。有没有一种使用连接表或其他构造的好方法?
我能想到的最简单的模型如果以下内容:
User
(用户名,电子邮件,密码,姓名和其他每个用户的常用数据)Participant
,摘要。 (与一个用户的关系 - 定义参与者的角色,行为及其常见数据)。应该为参与者提供界面。Student
(继承自参与者,添加自己的行为和数据)SchoolAdministrator
(继承自参与者)在面向对象的世界(非RDBMS)中,这有一个简单的优势:多态。拥有一个用户,你不需要确切地知道他是谁。你只需要这样做:
user.participant.can_manage_stuff?
user.participant.order_book(harry_potter)
将会执行相应的操作,这些操作将在Student
,SchoolAdministrator
或从Participant
继承的其他类中实施。
另一件事是系统非常轻松添加新角色。只需继承Participant
并实现其界面。
现在,当面向对象设计完成后,让我们查看数据存储。我假设您使用RDBMS。
所以现在你有两种类型的链接:
User
与Participant
之间的一对一关联。Participant
和Student
之间,SchoolAdministrator
。 1st的实现就像下表中的has_one
和/或belongs_to
关联一样简单(通过participant_id
列):
用户: id |用户名|电子邮件|密码|等| participant_id (非空)FK_TO_participants表|
所以你可以很容易地实现它。
现在,第二个链接可以在RDBMS中实现,数量为different wasy。
但幸运或遗憾的是 ActiveRecord只支持一个选项来做到这一点。并且层次结构每个映射策略使用 discriminator 列来区分类型(按照约定存储在type
列中)。
所以你会得到第二个看起来像这样的表:
perticipants: id | 输入 | student_card_number(null)| administrator_number(null)|等
此表格包含所有可能参与者的所有列。这是DB中最简单,最简单的层次结构实现。但从某些观点来看,这不是最优的。正如我在ActiveRecords中所说,无论如何它只有一个选项。
因此,在此设计的结果中,您将最终得到2个数据库表(用户,参与者)和至少3个类(用户,参与者,学生)。
当然,你可以在这里做出很多改变,但这应该是我的观点。
是的,请不要在数据库中使用XML,不要浪费你的神经和宝贵的个人时间。
干杯。
答案 1 :(得分:3)
如果您确实需要为您使用的每个角色分别使用模型,那么我建议使用多态关联(read more here)。所以:
# User model
belongs_to :owner, :polymorphic => true
# Student model
has_one :user, :as => :owner
# Any other model
has_one :user, :as => :owner
您需要添加到用户表:
t.integer :owner_id
t.string :owner_type