Каков наилучший способ создать связь TableA HABTM с TableA для приложения CakePHP?
-
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
с помощью ForeignKeyperson_id
Person
хасМаниRelation2
с помощью ForeignKeyrelation_id
Relation
Принадлежит кPerson
,Relation
,RelationType
Обратите внимание, что вы также можете достичь этой двойной взаимосвязи с HABTM.