使用Authlogic验证多个模型

Joh*_*tta 1 database-design ruby-on-rails authlogic

我有多个用户帐户类型,每个类型都有不同的信息.例如,业务联系人链接到企业,学校管理员和学生链接到学校.学生有实际地址,但业务联系人和学校管理员使用组织地址.每种类型都有其他独特的信息.

我倾向于为学生,学校管理员和业务联系人提供单独的表格,但是使用Authlogic,我有一个带有身份验证信息的Users表(所有人都需要登录).

问题是如何最好地将此单一身份验证表与各个配置文件相关联.看起来像一对一的关系需要一个表(例如用户< - >学生用户< - > Business_contacts).我希望有一种"一对一"的关系(用户< - >学生 Business_contacts).有没有一种使用连接表或其他构造的好方法?

或者,我可以统一Users表中的公共信息,并在XML中提供"profile"列以支持唯一信息.我的想法是将所有内容保存在干净的DB列中会简化选择/插入.

思想,想法?

Dmy*_*iak 5

业务联系人链接到企业,学校管理员和学生链接到学校.

这意味着您具有不同的用户角色而不是不同的用户.

学生有实际地址,但是商业联系人和学校管理员使用组织地址.每种类型的其他信息也是唯一的.

这意味着不同的角色具有不同的数据和行为,从而导致不同的OO类.

问题是如何最好地将此单一身份验证表与各个配置文件相关联.我希望有一种" 一对一 "的关系(用户< - >学生或Business_contacts).有没有一种使用连接表或其他构造的好方法?

我能想到最简单的模型如果:

  • User(每个用户的用户名,电子邮件,密码,名称和其他常见数据)
  • Participant,抽象.(与一个用户有关 - 定义参与者角色,行为及其共同数据).应该为参与者提供界面.
  • Student (继承自Participant,添加自己的行为和数据)
  • SchoolAdministrator (继承自参与者)
  • 等等

在面向对象的世界(非RDBMS)中,这有一个简单的优点:多态性.拥有一个用户,你不需要确切地知道他是谁.你只需要这样做:

user.participant.can_manage_stuff?
user.participant.order_book(harry_potter)
Run Code Online (Sandbox Code Playgroud)

而适当的措施将于将在执行Student,SchoolAdministrator或其他类从继承Participant.
另一件事是,为系统添加新角色非常容易.只需继承Participant并实现其界面.

现在,当面向对象设计完成后,让我们看一下数据存储.我假设你使用RDBMS.

所以现在你有两种类型的链接:

  1. User和之间的一对一关联Participant.
  2. 泛化(继承)之间ParticipantStudent,SchoolAdministrator.

1st的实现就像下表(通过列)拥有has_one和/或belongs_to关联一样简单participant_id:

用户:id | 用户名| 电子邮件| 密码| 等| participant_id(非null)FK_TO_participants表|

所以你可以很容易地实现它.

现在,第二个链接可以在RDBMS中实现多个不同的isy.

但幸运或不幸的是,ActiveRecord只支持一种选择.它是每个表映射策略的层次结构,它使用鉴别器列来区分类型(按照type惯例存储在列中).

所以你将有第二个表看起来像这样:

参与者:id | 类型 | student_card_number(null)| administrator_number(null)| 等等

此表将包含所有可能参与者的所有列.这是DB中最简单,最简单的层次结构实现.但从某些观点来看,这不是最优的.正如我在ActiveRecords中所说,无论如何它只有一个选项.

因此,在此设计的结果中,您将最终得到2个数据库表(用户,参与者)和至少3个类(用户,参与者,学生).

而且,当然,你可以在这里有很多不同,但这应该是我的观点.

是的,请不要在数据库中使用XML,不要浪费你的神经和宝贵的个人时间.

干杯.