2014-04-16 89 views
0

我正在使用ZF2和Doctrine开发管理日历事件的项目。所有这些事件共享一组共同的数据元素,但是独特类型的事件共享它们自己的独特类型特定数据元素集合。例如,所有事件都包括常见元素,例如eventID,eventNameeventDate。除了这些常见元素之外,“会议”事件还将具有其他元素,如会议专用的agenda,minutesattendees,“培训”事件将具有特定于培训的其他元素,“会议”事件“将有额外的独特元素,等等。如何设置带有条件关联的ZF2主义实体

该项目的索引视图将希望能够列出所有事件,但不会需要“公共”数据集之外的任何数据。如果一个事件属于某种类型,它也不属于另一种类型;所以每个事件只会与一个补充数据集相关联。某些事件类型可能有多个路由器:路由器sales/meetings[/action]将希望访问与路由器marketing/meetings[/action]相同或相同的实体,字段集和表单。

在我的数据库,我将有一个表名为events索引所有的事件,并记录常用的数据,和我有关联的表的集合像events_meetingsevents_trainingevents_conferences等记录型特异性数据。

我考虑了许多的项目不同的解决方案:

解决方法一:单个模块,单个events实体和字段集,以及实体和字段集对于每个特定类型的数据元素的组。该解决方案需要events实体具有多个OneToMany元素:每个关联数据集一个。我不知道这是否可能;即使有可能,我也不知道这是否是一个好主意。

解决方法二:一个单一的模块和复制的共同的“事件”的实体,字段集的副本:events_1被链接到events表并与events_meetings实体相关联; events_2events_1相同,除了OneToMany元素并且它与events_training实体相关联;和events_3,events_4,events_5等等各自与它们自己的补充数据集实体相关联。我可以看到这个工作,但它需要大量几乎相同的通用数据实体副本。

解决方法三:多个模块,每个模块具有单个events实体和字段集,和单个关联events_foo实体和字段集。这也许是最干净的解决方案,尽管它似乎创建了很多相同的代码。

解决方案四:重新配置数据模式,以便所有的补充数据可以存储在一个表中。例如,对于每个会议事件和agenda有一列,minutes的列和attendees的列,可以创建一个events_alt_data表,该表的每个元素都有不同的行列如eventID,elementType,elementTitleeventValue。Wordpress为独特的数据做了这样的事情,但在我的项目中,补充数据集是大部分数据将被存储的地方,我担心数据增长时可能会影响性能。该解决方案还需要一些创意编码来处理数据元素的条件性质,以及如何验证和设置可能是任何类型或长度的数据的选项。

有什么建议吗?

+0

http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html查看此链接中描述的歧视映射,您应该能够映射一个实体,但可以与几个基于数据库行数据差异从基础数据创建的实体。 – STLMikey

回答