我正在使用ZF2和Doctrine开发一个管理日历事件的项目。所有事件共享一组公共数据元素,但唯一类型的事件共享其自己唯一的特定于类型的数据元素集。例如,所有事件都包含常见元素,例如eventID
,eventName
和eventDate
。除了这些常见元素之外,“会议”事件还会包含特定于会议的其他元素,如agenda
,minutes
或attendees
,“培训”的事件将具有其他元素特定于培训的元素,作为“会议”的事件将具有其他独特元素,等等。
项目的索引视图希望能够列出所有事件,但不需要“常用”数据集之外的任何数据。如果一个事件属于某种类型,它也不属于另一种类型;所以每个事件只与一个补充数据集相关联。某些事件类型可能有多个路由器:路由器sales/meetings[/action]
将希望访问与路由器marketing/meetings[/action]
相同或相同的实体,字段集和表单。
在我的数据库中,我将有一个名为events
的表来索引所有事件并记录公共数据,我将拥有一组关联表,如events_meetings
,events_training
,events_conferences
等,以记录特定于类型的数据。
我正在为该项目考虑许多不同的解决方案:
解决方案一:单个模块,单个events
实体和字段集,以及每个特定于类型的数据元素组的实体和字段集。此解决方案将要求events
实体具有多个OneToMany元素:每个关联数据集一个元素。我不知道这是否可行;即使有可能,我也不知道这是不是一个好主意。
解决方案二:单个模块和常见“事件”实体和字段集的重复副本:events_1
链接到events
表并与{相关联{1}}实体; events_meetings
与events_2
相同,但OneToMany元素除外,它与events_1
实体相关联;并且events_training
,events_3
,events_4
等各自与其自己的补充数据集实体相关联。我可以看到这个工作,但它需要很多几乎相同的公共数据实体副本。
解决方案三:多个模块,每个模块都有一个events_5
实体和字段集,以及一个关联的events
实体和字段集。这可能是最干净的解决方案,虽然它似乎创建了许多相同的代码。
解决方案四:重新配置数据架构,以便所有补充数据都可以存储在单个表中。例如,不是让events_foo
表为每个会议事件和events_meetings
列添加一行,而是agenda
的列和minutes
的列,可以创建一个attendees
表,其中每个元素和列都有不同的行,例如events_alt_data
,eventID
,elementType
和elementTitle
。 Wordpress对于唯一数据执行类似的操作,但在我的项目中,补充数据集是存储大部分数据的地方,我担心随着数据的增长它可能会影响性能。此解决方案还需要一些创造性的编码来处理数据元素的条件性质,以及如何验证和设置任何类型或长度的数据选项。
有什么建议吗?