2010-07-11 21 views
0

假设我们有以下的局部ER图:可以在CakePHP中使用“语义颠倒”关联,比如Message blongsTo Attachment吗?

An ER diagram with 5 entities: messages, submissions, attachments, assignments, and lectures

注意,attachments表将随后用于这些消息的,提交,分配,和讲座附件。

问题在于attachmentsmessagessubmissionsassignments之间的3个一对一关系。根据CakePHP的约定,Message belongsTo Attachment(和Attachment hasOne Message)因为Message包含外键(同样的事情适用于其他2个关系)。当然,说Message hasOne Attachment(和那个Attachment belongsTo Message)更有意义。如果我们只有messagesattachments,通过将外键移动到attachments将很容易使“正确定位”的关系。

但问题再次是messagessubmissionsassignments,并lectures具有相同attachments表关系。获得“”语义上正确的“关系的一种方式是具有4种不同的Attachment型号:MessageAttachment,SubmissionAttachment,AssignmentAttachmentLectureAttachment

假设我们只是在检索某个消息,提交或分配的连接感兴趣,是OK使用这些语义颠倒协会,还是应该适当通过分离Attachment成4个不同的定位他们模型如上所述?

回答

0

通过语义你也意味着语言的自然语义。但是你正在谈论一个具有不同语义的特定技术场景。

这很好。这些只是名字。如果你有A和B(附件和信息),并且你的情况B有一个A,那么正确的说附件有一条消息。

0

警告:这个答案有点像“你应该可以用MVC框架做到这一点”。我对CakePHP不熟悉,并且简要地看一下文档,我无法弄清楚如何实际执行以下操作。

在Perl DBIx :: Class(我很熟悉)中,可以在关联中施加额外的约束,而不仅仅是fk匹配。我想通过添加字段type解决这个问题attachment,其指示对象的类型(例如,messagelecture)拥有此特定attachment然后给attachment一个foreign_id

查询语法应该是SELECT * from attachment WHERE foreign_id == myId AND type == MyType

看起来这样的结构可以让你消除attachments_lectures表,因为这似乎只是让你有许多演讲附件。如果你愿意,你也可以免费获得许多附件,用于作业,意见和信息。