Grails 1.3.7 + 2.0, раздел 5.2.1.1, «многие к одному» и «один к одному»

Раздел 5.2.1.1 содержит примеры A–C, которые кажутся немного запутанными:

Пример B: Это все еще отношение «многие к 1», как в примере A (т. е. такая же настройка таблицы)? В конце написано "чтобы сделать истинный один к одному, используйте свойство hasOne...".

Пример C: когда используется hasOne, следует ли больше не использовать ownTo? Это подразумевается?

Почему они показывают два варианта в примере C? С первым возникают проблемы?

Я пытаюсь понять все допустимые комбинации «многие к одному» и «один к одному».

Спасибо


person Ray    schedule 14.08.2011    source источник


Ответы (1)


Я согласен, что их терминология здесь немного сбивает с толку. Но я постараюсь помочь:

Многие к одному (А)

Здесь они имеют в виду отношения, в которых родительский объект указывает на один дочерний объект. Однако дочерний объект ничего не знает о родительском отношении. Причина (я полагаю), что они называют это «многие к одному», заключается в том, что уникальное сопоставление «один к одному» не применяется. Технически один и тот же Нос можно использовать на нескольких Лицах, просто сохранив их в отношениях. И если вы удалите Лицо, Нос продолжит существовать, только без лица. (Это становится странно писать!)

Один к одному хранится в родительской таблице (B)

Во втором примере они добавили belongsTo, чтобы установить отношение один к одному. Это означает, что существование Носа зависит от существования Лица. Итак, теперь это настоящие отношения один к одному. Внешний ключ для этой связи хранится в таблице Face из-за того, как он настроен (см. следующий раздел).

Один к одному хранится в дочерней таблице (C)

В последнем примере это все еще один к одному. Однако изменение простого Nose nose на static hasOne = [nose:Nose] привело к перемещению внешнего ключа в таблицу Nose. В этом случае вы используете belongsTo, потому что каждый Нос может быть связан только с одним Лицом.

В итоге

  • Простое присваивание Model model создает единую однонаправленную связь с дочерним элементом. У дочернего объекта нет прямого способа сослаться на родительское отношение, и фактически он может быть связан с несколькими родительскими моделями.
  • Двунаправленное взаимно-однозначное назначение требует, чтобы дочерний элемент belongTo был родителем, что также обеспечивает целостность данных посредством каскадирования.
  • Двунаправленное отношение один к одному, хранящееся в дочернем элементе, создается путем настройки родительского объекта на наличие одной (hasOne) дочерней модели.

Надеюсь, это немного поможет. (Я все еще думаю, что терминология многие к одному неудобна.)

person OverZealous    schedule 14.08.2011
comment
Спасибо за ваш ответ Я хочу, чтобы комментарии поддерживали возврат каретки. В упр. B: как вы думаете, почему они делают это утверждение в конце примера B, т. е. делают отношения истинными один на один? В Ex C, почему у них нет комбинации, использующей как hasOne, так и ownTo? - person Ray; 14.08.2011
comment
Я думаю, что B по-прежнему является Many-to-1, но теперь с Cascade для сохранения и удаления. Однако этим можно было бы выстрелить себе в ногу, как если бы, скажем, есть класс X и класс Y, и x1 ссылается на y1, а x2 ссылается на y1. Тогда удаление x1 приведет к удалению y1, и поэтому у x2 будут проблемы (поскольку y1 больше нет). - person Ray; 14.08.2011
comment
Похоже, вы поняли это немного лучше, чем я! - person OverZealous; 15.08.2011
comment
Не совсем OverZealous - я все еще в замешательстве, и я ценю ваши мысли, которые полезны. Я собираюсь опубликовать вопрос о том, следует ли использовать hasOne и ownTo вместе. - person Ray; 15.08.2011
comment
Тьфу, я потратил еще час на чтение этого материала, чтобы найти то, что кажется определенным несоответствием в документах Grails, а именно в разделе, о котором мы говорим, где 1) в примере C сказано, что это свойство помещает внешний ключ в обратной таблице из предыдущего примера и 2) самый последний фрагмент кода в принадлежит и обсуждение того, как создаются обратные ссылки. В примере B используется статическое свойство ownTo = [face:Face], которое, как сказано в документации, создаст обратную ссылку. - person Ray; 15.08.2011