Joh*_*tta 1 database-design ruby-on-rails authlogic
我有多个用户帐户类型,每个类型都有不同的信息.例如,业务联系人链接到企业,学校管理员和学生链接到学校.学生有实际地址,但业务联系人和学校管理员使用组织地址.每种类型都有其他独特的信息.
我倾向于为学生,学校管理员和业务联系人提供单独的表格,但是使用Authlogic,我有一个带有身份验证信息的Users表(所有人都需要登录).
问题是如何最好地将此单一身份验证表与各个配置文件相关联.看起来像一对一的关系需要一个表(例如用户< - >学生或用户< - > Business_contacts).我希望有一种"一对一"的关系(用户< - >学生或 Business_contacts).有没有一种使用连接表或其他构造的好方法?
或者,我可以统一Users表中的公共信息,并在XML中提供"profile"列以支持唯一信息.我的想法是将所有内容保存在干净的DB列中会简化选择/插入.
思想,想法?
业务联系人链接到企业,学校管理员和学生链接到学校.
这意味着您具有不同的用户角色而不是不同的用户.
学生有实际地址,但是商业联系人和学校管理员使用组织地址.每种类型的其他信息也是唯一的.
这意味着不同的角色具有不同的数据和行为,从而导致不同的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.
所以现在你有两种类型的链接:
User和之间的一对一关联Participant.Participant和Student,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,不要浪费你的神经和宝贵的个人时间.
干杯.
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |