Каков наилучший способ создать связь TableA HABTM с TableA для приложения CakePHP?

StackOverflow https://stackoverflow.com/questions/226805

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть необходимость создать функциональность, позволяющую моим зарегистрированным пользователям ассоциировать себя с другими видами использования и создавать семью.Мои таблицы базы данных выглядят примерно так:

бд.лица - (Боб, Джейн, Тимми и т.д.)

  • ID
  • Имя
  • Адрес электронной почты

db.persons_персоны

  • ID
  • лицо__id_родитель
  • персона_ид_чайлд
  • relationtype_id идентификатор типа отношения

db.типы отношений - (супруг, ребенок, племянник и т.д.)

  • ID
  • Имя

С помощью этой структуры я должен быть в состоянии указать, что Боб является супругом Джейн в таблице persons_persons.Запись в db.persons_persons будет выглядеть примерно так (псевдоним):

ID | person_parent | person_child | relationtype
1  | Bob           | Jane         | Spouse
2  | Bob           | Timmy        | Child

Я понимаю, что это может привести к некоторой фрагментации данных, поскольку, если Боб и Джейн женаты, то ребенок одного должен быть связан с другим.Однако это не мой вопрос.Мой вопрос заключается в том, является ли эта настройка базы данных "наиболее правильной" для использования в приложении CakePHP.

Это было полезно?

Решение

Во-первых, CakePHP автоматически изменит people таблицу в people контроллер и person модель, так что вам не нужно ее вызывать persons.Затем я бы вызвал таблицу подстановки relationships вместо того , чтобы persons_persons.

Я бы назвал поля в вашей таблице отношений person_id, relation_id и relation_type_id, а затем добавьте подчеркивание в вашем relationtypes имя таблицы, чтобы оно стало relation_types.

Я думаю, что это более семантично.

Вы все еще могли бы использовать ассоциацию hasAndBelongsToMany и использовать automagic "с" ассоциации, предлагаемые CakePHP (только 1.2) для доступа к дополнительным данным в таблице HABTM для типа отношения.

Тем не менее, у меня было бы искушение использовать:

  • Person хасМани Relation
  • Relation Принадлежит к Person, Relation, RelationType

Подразумевается ли в вашем приложении связь с людьми через отношение к ним кого-то другого?То есть.если вы найдете Person.id = 1, вы можете получить все их отношения, напримерPerson.id 2, 3 и 4.Но если вы найдете Person.id 2, вы не получите автоматически Person.id = 1, если только в таблице отношений не было другой записи, которая представляла бы эту связь.

Чтобы достичь этого, вы можете настроить другую ассоциацию:

  • Person хасМани Relation1 с помощью ForeignKey person_id
  • Person хасМани Relation2 с помощью ForeignKey relation_id
  • Relation Принадлежит к Person, Relation, RelationType

Обратите внимание, что вы также можете достичь этой двойной взаимосвязи с HABTM.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top