0

假设我们有以下部分 ER 图:

具有 5 个实体的 ER 图:消息、提交、附件、作业和讲座

请注意,该attachments表随后将用于消息、提交、作业和讲座的附件。

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

但问题又是 , messages, submissions,assignmentslectures与同attachments一张表有关系。获得“语义正确”关系的一种方法是使用 4 种不同的Attachment模型:MessageAttachmentSubmissionAttachmentAssignmentAttachmentLectureAttachment

假设我们只对检索某个消息、提交或分配的附件感兴趣,那么使用这些语义反转的关联是否可以,或者我们应该通过分离成上述 4 个不同的模型来正确定位它们?Attachment

4

2 回答 2

0

语义也指语言的自然语义。但是您正在谈论具有不同语义的特定技术场景。

这完全没问题。这些只是名字。如果您有 A 和 B(附件和消息),并且在您的情况下 B 有一个 A,那么说附件有一个消息是正确的。

于 2010-07-11T13:17:36.550 回答
0

警告:这个答案有点类似于“你应该能够使用 MVC 框架来做到这一点”。我对 CakePHP 不熟悉,简要查看文档我无法弄清楚如何实际执行以下操作。

在 Perl DBIx::Class(我很熟悉)中,可以在belongs to关系中施加额外的约束,而不仅仅是 fk 匹配。我将通过向 中添加一个字段type来解决此问题,该字段指示拥有此特定attachment对象的对象类型(例如 , message) ,然后给出一个.lectureattachmentattachmentforeign_id

查询语法为SELECT * from attachment WHERE foreign_id == myId AND type == MyType.

看起来这种结构可以让你消除attachments_lectures表格,因为这似乎只是让你每堂课都有很多附件。如果您愿意,您还可以免费获得许多作业、提交和消息的附件。

于 2010-07-11T13:25:18.420 回答