Можно ли использовать «семантически обращенные» ассоциации, такие как Message blongsTo Attachment, в CakePHP? - PullRequest
0 голосов
/ 11 июля 2010

Предположим, что у нас есть следующая частичная диаграмма ER:

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

Обратите внимание, что впоследствии таблица attachments будет использоваться для сообщений ", представления", назначения ",и вложения лекций.

Проблема заключается в трех взаимно-однозначных отношениях между attachments и messages, submissions и assignments.Согласно соглашениям CakePHP, Message belongsTo AttachmentAttachment hasOne Message), потому что Message содержит внешний ключ (то же самое относится и к двум другим отношениям).Конечно, имеет смысл сказать, что Message hasOne Attachment (а это Attachment belongsTo Message).Если бы у нас было только messages и attachments, было бы легко " правильно сориентировать " отношения, переместив внешний ключ в attachments.

Но проблема снова заключается в том, чтоmessages, submissions, assignments и lectures имеют отношения с одной и той же таблицей attachments.Один из способов получить семантически правильные отношения состоит в том, чтобы иметь 4 разные модели Attachment: MessageAttachment, SubmissionAttachment, AssignmentAttachment и LectureAttachment.

.мы заинтересованы только в получении вложения определенного сообщения, отправки или назначения, нормально ли использовать эти семантически обращенные ассоциации, или мы должным образом сориентируем их путемразделить Attachment на 4 разные модели, как указано выше?

Ответы [ 2 ]

0 голосов
/ 11 июля 2010

Предупреждение: этот ответ немного похож на «вы должны быть в состоянии сделать это с помощью инфраструктуры MVC».Я не знаком с CakePHP и, кратко просматривая документацию, я не могу понять, как на самом деле сделать следующее.

В Perl DBIx :: Class (с которым я знаком) можно наложить дополнительныеограничения в belongs to отношениях, чем просто соответствие FK.Я бы решил эту проблему, добавив поле type к attachment, которое указывает тип объекта (например, message, lecture), которому принадлежит данный конкретный attachment, а затем даст attachment a foreign_id.

Синтаксис запроса будет SELECT * from attachment WHERE foreign_id == myId AND type == MyType.

Похоже, что эта структура позволит вам исключить таблицу attachments_lectures, так как кажется, что это просто позволяет иметь много вложений влекция.Вы также получите бесплатно возможность иметь множество вложений для заданий, сообщений и сообщений, если вы так склонны.

0 голосов
/ 11 июля 2010

Под семантикой вы также подразумеваете естественную семантику языка. Но вы говорите о конкретном техническом сценарии, который имеет другую семантику.

Это прекрасно. Это просто имена. Если у вас есть A и B (вложения и сообщения), а в вашем случае B имеет одно A, то - это правильная вещь, чтобы сказать, что вложение имеет одно сообщение.

...