@Didi00

Связи (отношения) между сущностями. Отслеживание связей второго, третьего, n+ уровня. Какие варианты решения?

Добрый день!

Есть задача отслеживания связей второго, третьего, n+ уровня между сущностями в базе данных.
База данных MySQL, язык программирования PHP.

Прошу подсказать оптимальные варианты решения.
Имеется ввиду в каком направлению углубиться, технологии, алгоритмы, ссылки на документы, решения.
Какое возможное оптимально решение на php - mysql ?
Возможно стоит использовать дополнительные инструменты, технологии.

Заранее благодарю!
5cc41cd8c3ec4471884741.png5cc41fccb42e7321495124.png
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 1
@UndineS
Посмотри примеры по нормализациям баз данных, там должно быть как раз о подобных случаях связей "один ко многим", "многие ко многим". И про первичные/внешние ключи.

Вообще стандартные решения:
  • если используется связь "один к одному" и полей у дополнительной сущности не много, то она часто хранится в той же таблице - например, если у Персонажа может быть только один Телефон, о котором нужно знать только номер целиком без дальнейшей разбивки, то в таблице "Персонаж" будут поля по персонажу (ФИО, Документ, Адрес и т.п.) + поле для номера телефона;
  • если "один к одному", а о дополнительной сущности информации много (требуется 2 и более полей для описания дополнительной сущности), то, например, для "Телефона" заводим отдельную таблицу, у каждой записи будет первичный ключ (классический вариант - ID), а в таблице "Персонаж" создаем внешний ключ - т.е. заводим не поле "Номер телефона", а поле "ID телефона", где, собственно, указываем ID записи с телефоном;
  • в случае связи "один ко многим", "многие ко многим" - заводим дополнительную промежуточную таблицу "Персонаж - Телефон", где указываем пары "ID персонажа - ID телефона". Соответственно, записи в промежуточной таблице "Персонаж - Телефон" будут являться внешними ключами, которые ссылаются на записи с соответствующими первичными ключами в таблицах "Персонаж" и "Телефон" - например, в таблице с полями "ID персонажа, ID телефона" записи (1,1), (1,2), (1,3) будут указывать, что у персонажа с ID=1 есть три телефона с ID = 1, 2 и 3.


Для формирования запроса с выгрузкой связей большой вложенности следует использовать JOIN - объединение таблиц по ключам. С помощью JOIN можно сделать выборку типа:
Выбираем записи таблицы "Персонаж"
Объединяем с таблицей "Персонаж - Домен" по условию "Персонаж.ID"="Персонаж-Домен.ID_Персонажа"
Объединяем с таблицей "Домен" по условию "Персонаж-Домен.ID_Домена"="Домен.ID"

Таким образом можно в запрос добавить еще сколько нужно объединений.

Пример использования JOIN на MySQL:
SELECT person.*, domain.*
FROM person
LEFT JOIN person_domain ON person.id=person_domain.person_id
LEFT JOIN domain ON person_domain.domain_id=domain.id;


Как подключиться к БД из PHP и отправить запрос, можно прочитать, например, тут: www.softtime.ru/bookphp/gl12_10.php
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы