Я считал, что я неплохо разбираюсь в теории баз данных, но одну вещь придумать не могу. может переработал я.
В чем суть. Есть некая таблица клиентов. Вопрос: Как по парно связать между собой 2-х клиентов.
Решения которые пришли в голову.
1. Создать таблицу связей. table(client_1, client2) и создать уникальный индекс по двум полям, но при этом таблица не запрещает добавлять 2 записи (client_1, client2) и (client_2, client_1), т.е. получается для одной связи 2 строки добавилось у меня. Получается, что целостность БД мне приходится поддерживать на уровне приложения. Как сделать, чтоб нельзя было вторую запись добавлять?
2(друг посоветовал). Создать виртуальные контейнера. Для каждой парной связи создать свой контейнер и добавлять в этот контейнер обоих клиентов. Это в некотором случает решает предыдущую проблему, но появляется другая, как сделать, чтобы в этот контейнер случайно не добавили третьего клиента, т.к. мне нужно только 2-их связать. Получается, что здесь тоже нужно поддерживать целостность БД на уровне приложения.
Как вы решаете такую задачу? Помогите, а то что то в голову ничего не приходит.
А почему смущает (client1, client2) и (client2,client1) ?
К примеру если речь идет о доверенных лицах - то Вася может быть доверенным лицом Пети, а Петя может быть, а может и не быть доверенным у Васи.
Соответственно дальнейшие запросы "кому доверяет Вася" и "у кого в доверенных Вася" - отлично разруливаются, а "кто с кем имеет любые отношения" - разруливается с distinct
Заведите в таблице поле по значению которого будете объединять записи, пусть это будет поле tag и пусть в этой таблице будет уникальное поле id.
Запрос с объединением примерно такой:
select T1.*, T2.*
from table T1
join table T2 on T2.tag=T1.tag and T2.id <> T1.id
Abdula Magomedov: В этом случае описанный вами 1 вариант вполне подходит. Дополнительно нужно предусмотреть проверки для случаев, которые вы сами и описываете. Этого не избежать, если выдвигаются подобные требования.
А в варианте с "виртуальными контейнерами" я вообще не понял о чем речь. Слово "виртуальный" когда дело доходит до конкретики вносит какую-то неопределенность :)