2010-07-11 2 views
0

Предположим, что мы имеем следующую частичную диаграмму ER:Можно ли использовать «семантически обратные» ассоциации, например Message blongsTo Attachment, в CakePHP?

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

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

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

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

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

ответ

0

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

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

0

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

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

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

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