@santaatnas
Java, Python, Php

Как сделать связь многие к многим для одной таблицы?

Суть вопроса, есть сущность, которая хранится в 1 таблице, назовем ее работники (workers), и необходимо вести еще одну таблицу, в которой хранить связь, кто с кем работал с интервалами времени (woker_relations) . На ум приходит 2 варианта организации, и в первом и во втором, таблица workers одинакова, а вот во второй таблице либо такие поля (id, worker_id, partner_id, start_date, end_date) либо (id, worker_1_id, worker_2_id ,start_date, end_date). В первом случае, вроде архитектурно правильно, можно наложить уникальность на поля по id и дате (хотя вроде бы не все субд позволяют это применительно к дате), но будет происходить дублирование данных (у worker 1 будет связь с worker 2 и наоборот). Во втором же случае дублирование не будет, но усложняются запросы на выборки (приходится писать запросы вида: ...where worker_1_id = 123 or worker_2_id = 123) и придется делать доп запрос на уникальность перед вставкой. Может есть еще какие-то варианты? Спасибо за ответ. И еще вапрос с ORM маппингом возникает)...
  • Вопрос задан
  • 451 просмотр
Решения вопроса 1
@x_shader
Oracle & Coffee
Подумайте над добавлением дополнительной сущности "рабочая группу" с атрибутами "дата начала" и "дата конца".
В общем случае, так перекрываются нестандартные ситуации, вроде
- кто-то заболел и напарник работал сам
- в группу добавили третьего
- кто-то работает на двух проектах

Но тут от конкретного бизнес-кейса зависит. Надо знать ограничения.

#team

team_id	|	start_date	|	end_date
--------------------------------------------------
	1	|	01.01.2018	|	05.01.2018

#team_worker

team_id	|	worker_id	
--------|---------------
	1	|	101			
	1	|	102


P.S. В ваших вариантах поле "ид связи", похоже, избыточное. Уникальность связи делают по ( worker_1_id, worker_2_id, start_date).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы