Как привязать два поля в базе данных

272
23 марта 2017, 19:54

Имеется база для пользователей (родители и дети):

 - id пользователя
 - Фамилия
 - Имя
 - Номер телефона
 - Номер ребенка/родителя
 - Дата регистрации

И таблица координат:

 - Id координаты
 - Id пользователя
 - Широта
 - Долгота
 - Дата

Вот никак не могу понять как привязать родителя с ребенком, то есть регистрируется родитель, а потом ребенок. И в этом случае будут отправляться координаты ребенка родителю, а родителя ребенку. Я думаю создать еще одну таблицу для привязки, типа этого:

 - id родителя 
 - id ребенка

то есть, если родитель зарегистрировался и ввел номер ребенка, сюда вставляется его ID, а поле для ID ребенка будет пусто пока ребенок не зарегистрируется под своим номером и не совпадет его номер с тем, который ввел родитель. И наоборот если первым зарегался ребенок......

Вопрос: Будет ли правильно такая форма привязки или неправильно я все делаю, подскажите?

UPD: если неправильно сформулировал свои мысли, то к примеру могу привести соц. сети. Как пользователи отправляют запрос о дружбе другому пользователю и другой принимает дружбу? То есть что именно в базе происходит в этом случае?

Answer 1

Один из вариантов проектирования такой структуры может быть таким.

Структура таблиц

Пользователи
 - id пользователя
 - Фамилия
 - Имя
 - Номер телефона
 - Дата регистрации
Кординаты_пользователей
 - Id координаты
 - Id пользователя
 - Широта
 - Долгота
 - Дата
Родственные_отношения
 - пользователь_1
 - пользователь_2
 - тип отношения: отец, мать, сын, дочь, бабушка и т.п
 - дата запроса
 - дата ответа
 - статус запроса: в ожидании, отклонён, подтверждён

Случаи взаимодействия

Случай 1. Пользователь одиночка (родитель или ребёнок)

  • Регистрируется пользователь А.
  • Запись в Пользователи.

Случай 2. Пользователь родитель

  • Регистрируется пользователь Б.
  • Запись в Пользователи.
  • Ищем номер Пользователя А (ребёнка).
  • Проверяем наличие родственных связей.
  • Если их нет, то посылаем запрос на подтверждение родственных связей.

    • Запись в Родственные_отношения кортежа: (Б, А, отец, дата запроса, null, в ожидании).
  • Пользователь А получает и подтверждает запрос.

    • Обновление в Родственные_отношения кортежа: (Б, А, отец, дата запроса, дата ответа, подтверждён).

Взаимодействие с БД

При вышеупомянутой схеме отношение Родственные_отношения может выглядеть так (без дат и статуса):

Пользователь_1 | Пользователь_2 | Тип  |
===============|================|======|
Адам           | Каин           | отец |
Ева            | Авель          | мать |
Сиф            | Адам           | сын  |
Енос           | Сиф            | сын  |

Запросы на выборку детей может иметь такой вид:

SELECT Пользователь_1 FROM Родственные_отношения
WHERE 
  Пользователь_2 = "Адам" 
  Тип IN ("сын", "дочь")
UNION 
SELECT Пользователь_2 FROM Родственные_отношения
WHERE
  Пользователь_1 = "Адам" 
  Тип = "отец"
READ ALSO
Несколько результатов из БД, с учётом сортировки

Несколько результатов из БД, с учётом сортировки

Имеется таблица book в которой около 50 записейПоля таблицы id(int),name(varchar),path(text),lang(int, value = 1,2,3)

203
Как правильно сформировать запрос к mysql?

Как правильно сформировать запрос к mysql?

Есть mysql таблица id | username | number | created_at 1 | valera | 50 | 2017-03-19

204
Почему выбирает только первую строку из результата

Почему выбирает только первую строку из результата

Выбирает из базы только первую строкуЧто может быть не так?

255