Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
Добрый день.
Есть таблица со столбцом "UserID", куда пишется уникальный идентификатор пользователя.
Каждый UserID может дружить с несколькими другими UserID.
Как наиболее правильно реализовать запись данных об этой дружбе, если учесть, что все UserID находятся в одной таблице в одном столбце?
9 июн 19, 23:03    [21905558]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30825
tempreg00
Как наиболее правильно реализовать запись данных об этой дружбе, если учесть, что все UserID находятся в одной таблице в одном столбце?
Сделать таблицу с 2мя полями (Кто, СКем)
10 июн 19, 02:13    [21905598]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
aleks222
Member

Откуда:
Сообщений: 857
alexeyvg
tempreg00
Как наиболее правильно реализовать запись данных об этой дружбе, если учесть, что все UserID находятся в одной таблице в одном столбце?
Сделать таблицу с 2мя полями (Кто, СКем)

Сначала надоть решить: коммутативно ли отношение дружения?
Т.е. если А дружит с Б следует ли из этого, что Б дружит с А?
10 июн 19, 09:21    [21905679]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
aleks222
alexeyvg
пропущено...
Сделать таблицу с 2мя полями (Кто, СКем)

Сначала надоть решить: коммутативно ли отношение дружения?
Т.е. если А дружит с Б следует ли из этого, что Б дружит с А?
Безответной дружбы не бывает!
10 июн 19, 09:34    [21905695]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
alexeyvg, благодарю. Логически тоже пришёл к этому. Ещё пытался установить связи и первого и второго столбца (Кто, СКем) с UserID первой таблицы, но SQL запрещает добавить вторую связь к одному столбцу. Значит, вообще без связей использовать?
10 июн 19, 10:03    [21905712]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
aleks222, да, они дружат полноценно и в обе стороны) хотя, с точки зрения организации БД, вопрос действительно немного сложнее, чем кажется.
Думаю, используя способ сохранения alexeyvg, для получения списка друзей предполагается получать все значения столбца "СКем", при определённом столбце "Кто".
В таком случае понимаю, что будет дублирование данных при сохранении списка дружбы того, кто уже попал ранее в список в столбец "СКем".
10 июн 19, 10:12    [21905717]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30825
tempreg00
Ещё пытался установить связи и первого и второго столбца (Кто, СКем) с UserID первой таблицы, но SQL запрещает добавить вторую связь к одному столбцу. Значит, вообще без связей использовать?
Во первых, ничего он не запрещает, но это просто не нужно.

Во вторых, вам нужно установить 2 связи: "Кто с UserID" и "СКем с UserID"
aleks222
alexeyvg
пропущено...
Сделать таблицу с 2мя полями (Кто, СКем)

Сначала надоть решить: коммутативно ли отношение дружения?
Т.е. если А дружит с Б следует ли из этого, что Б дружит с А?
Да в общем схема от этого не меняется.
Разве что, если отношение коммутативно, то нужно запретить лишние пары типа (1,2) и (2,1)
10 июн 19, 10:35    [21905739]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30825
tempreg00
В таком случае понимаю, что будет дублирование данных при сохранении списка дружбы того, кто уже попал ранее в список в столбец "СКем".
Да, поэтому, что бы не было дублирования, нужно запретить дублирование. :-)
10 июн 19, 10:36    [21905743]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
alexeyvg
Да, поэтому, что бы не было дублирования, нужно запретить дублирование. :-)


Вероятно тут мне нужна уже практическая помощь. Для второй таблицы создан парный ключ (Кто, СКем), дублирование 1,2 он запрещает, но дублирование 2,1 нет. Не нахожу настройку, отвечающую за такой запрет, где это настраивается?
10 июн 19, 11:34    [21905795]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
Кесарь
Member

Откуда:
Сообщений: 453
tempreg00,

через ограничения никак.

Это можно сделать при помощи триггеров, срабатывающих при попытке вставки или апдейта.
10 июн 19, 12:24    [21905848]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Надо разрешить строку 1-2 и запретить строки 2-1?
CHECK(Кто < СКем)
10 июн 19, 12:27    [21905850]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20223
Я в упор не понимаю желания остаться в рамках одной таблицы. При том, что соотношение имеет тип M:N.

Сделайте две таблицы. Первая - собственно юзеры, вторая - дружбы.

А чтобы не хранить дубли, на таблицу дружбы наложите констрейнт "ID кто" < "ID с кем" и создайте "переворачивающий" триггер на случай, если кто-то попытается ввести наоборот. И вьюшку, которая создаёт полный список дружб тупым UNION.

Или наоборот, храните дубли - и тогда создайте триггер, который по любому действию выполняет такое же действие с "обратной" парой.
10 июн 19, 12:30    [21905852]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
tempreg00
Как наиболее правильно реализовать запись данных об этой дружбе, если учесть, что все UserID находятся в одной таблице в одном столбце?
В качестве альтернативы можно рассмотреть - https://docs.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-architecture?view=sql-server-2017
10 июн 19, 12:54    [21905867]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
982183
Member

Откуда: VL
Сообщений: 3350
А втроём и более дружить могут?
10 июн 19, 13:03    [21905877]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
Akina,
Нет необходимости оставаться в одной таблице. Уже создана вторая. Актуальный вопрос был как ликвидировать хранение лишних пар.
10 июн 19, 16:39    [21906059]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
982183,

В рамках данной задачи нет))
10 июн 19, 16:40    [21906061]     Ответить | Цитировать Сообщить модератору
 Re: Связь таблицы с собой  [new]
tempreg00
Member

Откуда:
Сообщений: 7
Всем большое спасибо за информативность и скорость ответов.
Сделал двумя таблицами, то, что нужно работает.
10 июн 19, 16:44    [21906065]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить