我有一个应用程序,正在广泛使用一个实体模型。
在这个应用程序的过去版本中(正在重写,当前版本在PHP中),这是用一个表继承建模的,基本上有两个相同的模型。
我们目前有一篇关于实体的专栏,用于addressbook_id将项目实体映射回地址簿,或者失败了,我们试图基于电子邮件地址进行映射。通讯簿和实体之间的数据不能保持同步,也就是说,必须能够更新项目中的实体,而不会对通讯簿中的数据产生任何影响(尽管我们也提供了更新通讯簿的选项)。
无论如何,有4或5种类型的实体。他们大多有相同的字段(姓名、姓氏、电子邮件、地址、电话等)。每个实体类型可能有1-3个字段,这些字段对它来说是唯一的,但这就是它的意义所在。除此之外,当前应用程序中的实体可能是人员或公司(相同的STI表,其中也有一个company_name字段)。
对于应用程序需要做的事情,能够很容易地找到一个项目的所有实体(不管类型,他们是人还是公司)是一个胜利。还能够轻松地将实体连接到查询中,并在每个项目中搜索它们,胜诉。
正因为如此,我倾向于坚持STI模型,并保持它的简单,因为每种类型共享90%的相同领域,这不是很多浪费。然而,我很好奇是否有什么好的建议来处理对于Addressbook和Entity都有本质上相同的模型,但是将数据保存在单独的表中的整个问题。我已经考虑过多态关联可能会有什么帮助,但我认为这会使表结构更加复杂,并可能损害查询的性能(相当大的数据集,其中这些实体可能包含在列表视图中)。
但我真的不想这样结束..。
class Entity
class Customer < Entity
class Addressbook
class AddressbookCustomer < Addressbook
etc...不太干燥,实体类型和子类型之间也有共同的功能(例如,实体和地址簿都有一个返回全名的name方法,而且Customer和AddressbookCustomer都可能有一个last_order方法)。
当前的数据只存储在两个表中,即地址簿和实体,其中有一个类型列。然而,这是一个干净的突破,所以遗留的表结构不需要保留,但是从保持它简单的角度来看,我非常喜欢这个结构。
有什么建议吗?
发布于 2011-03-05 06:18:23
我从来没有这样做过,但是如果您想在所有“实体”之间共享代码,为什么不创建一个其他所有继承的基类:
class OneClassToRuleThemAll < ActiveRecord::Base
def name
...
class Entity < OneClassToRuleThemAll
set_table_name "entities"
class AddressBook < OneClassToRuleThemAll
set_table_name "address_books"这为共享方法提供了一个基类,但为继承树中的每个分支提供了单独的表。
如果您不喜欢该解决方案,因为您仍然希望共享不属于OneClassToRuleThemAll但在树下的表亲类之间共享的方法,那么为什么不编写一个小模块来保存这些函数,比如last order,然后将该模块导入到每个需要这些函数的表亲类中?
我甚至不知道第一个例子是否有效,但我认为应该这样做。
https://stackoverflow.com/questions/5201821
复制相似问题