powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь таблицы с собой
15 сообщений из 15, страница 1 из 1
Связь таблицы с собой
    #35847299
Tu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tu
Гость
Искал, искал... формулировал поисковые запросы, формулировал... но ничего толком не нашел. Помогите, хотя бы подсказкой, где и что искать.
БД - MySQL.

Допустим, есть таблица пользователей:

idданные
Задача, сделать возможность связывать пользователей между собой. Получаем таблицу:

id-пользователя 1 id-пользователя 2 данные связи
И что теперь? Ну выбирать, относительно не проблема, UNION. Но как сделать уникальность пары в обе стороны? И как в таких случаях, не дублируют же информацию в обе стороны? Может это вообще не так связывается, не буду углубляться в поток непонимания, для начала этого хватит (а то сейчас нагорожу, время-то 2 часа ночи).
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847302
Tu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tu
Гость
Tuне дублируют же информацию в обе стороны?
Что облегчало бы многое ))
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847434
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TuИскал, искал... формулировал поисковые запросы, формулировал... но ничего толком не нашел. Помогите, хотя бы подсказкой, где и что искать.
БД - MySQL.

Допустим, есть таблица пользователей:

idданные
Задача, сделать возможность связывать пользователей между собой. Получаем таблицу:

id-пользователя 1 id-пользователя 2 данные связи
И что теперь? Ну выбирать, относительно не проблема, UNION. Но как сделать уникальность пары в обе стороны? И как в таких случаях, не дублируют же информацию в обе стороны? Может это вообще не так связывается, не буду углубляться в поток непонимания, для начала этого хватит (а то сейчас нагорожу, время-то 2 часа ночи).
Сделайте 2 таблицы: Пользователи и СвязиПользователей. В пользователях храните их уникальные id и аттрибуты, в связях 2 столбца Пользователь1, Пользователь2, входящие в Primary Key, что гарантирует уникальность связи между пользователями без дублирования.

P.S. Вообще то лучше книжки умные почитать про проектирование баз, нормализацию и т.д. ;)
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847658
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TuИскал, искал... формулировал поисковые запросы, формулировал... но ничего толком не нашел. Помогите, хотя бы подсказкой, где и что искать.
БД - MySQL.

Допустим, есть таблица пользователей:

idданные
Задача, сделать возможность связывать пользователей между собой. Получаем таблицу:

id-пользователя 1 id-пользователя 2 данные связи
И что теперь? Ну выбирать, относительно не проблема, UNION. Но как сделать уникальность пары в обе стороны? И как в таких случаях, не дублируют же информацию в обе стороны? Может это вообще не так связывается, не буду углубляться в поток непонимания, для начала этого хватит (а то сейчас нагорожу, время-то 2 часа ночи).Добавьте CHECK CONSTRAINT id_1 < id_2 и вы сможете ввести связь для пользователей только один раз...
Запросы - придется делать UNION-ами.

Поэтому некоторые, чтобы упростить себе жизнь добавляют обратную свзяь.

PS: то что вы нарисовали - это ориентированный граф.
Вы хотите сделать неориентированный.
Один из способов построить неориентированный из ориентированного - добавление обратных переходов.
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847669
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть для ненаправленных связей между объектами, можно считать их группировками объектов, даже более чем по два объекта в группе.

objects ( object_id, object_data )

groups ( group_id, group_data )

object_groups ( object_id, group_id )
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847670
Tu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tu
Гость
ASCRUS
Сделайте 2 таблицы: Пользователи и СвязиПользователей. В пользователях храните их уникальные id и аттрибуты, в связях 2 столбца Пользователь1, Пользователь2, входящие в Primary Key, что гарантирует уникальность связи между пользователями без дублирования
Все что Вы написали, реализовано (что и написано выше). Но составной первичный ключ не спасает, вполне реальна такая ситуация:

id-пользователя 1 id-пользователя 2 данные связи12...21...
Уникальности связи нет. Основные проблемы начинаются при модификации, надо анализировать по двум полям и на основе изменять (в целом, это не проблема, но как-то кривовато).
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847696
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatМожет быть для ненаправленных связей между объектами, можно считать их группировками объектов, даже более чем по два объекта в группе.Нельзя.
Их того, что объект 1 граничит с 2, а объект 2 граничит с 3 - не значит, что у 1 и 3 есть общая граница.
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847805
Tu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tu
Гость
Bely, большое спасибо!
P.S. читаю ман, но может кто-то знает, MySQL поддерживает CHECK CONSTRAINT или нет?
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847849
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyНельзя.
Их того, что объект 1 граничит с 2, а объект 2 граничит с 3 - не значит, что у 1 и 3 есть общая граница.не вижу противоречия

objects
объект_1
объект_2
объект_3

groups
граница_1_2
граница_2_3

object_groups
объект_1 граница_1_2
объект_2 граница_1_2
объект_2 граница_2_3
объект_3 граница_2_3

нет группы, содержащей объекты 1 и 3
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35847937
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatBelyНельзя.
Их того, что объект 1 граничит с 2, а объект 2 граничит с 3 - не значит, что у 1 и 3 есть общая граница.не вижу противоречия

objects
объект_1
объект_2
объект_3

groups
граница_1_2
граница_2_3

object_groups
объект_1 граница_1_2
объект_2 граница_1_2
объект_2 граница_2_3
объект_3 граница_2_3

нет группы, содержащей объекты 1 и 3Было две сущности - узлы и дуги.
Вы же для этого прилепили три таблицы.
Фактически вам приходится на каждую дугу заводить группу.
Чем от этого легче?
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35848004
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyЧем от этого легче?выборки - без UNION
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35848333
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TuASCRUS
Сделайте 2 таблицы: Пользователи и СвязиПользователей. В пользователях храните их уникальные id и аттрибуты, в связях 2 столбца Пользователь1, Пользователь2, входящие в Primary Key, что гарантирует уникальность связи между пользователями без дублирования
Все что Вы написали, реализовано (что и написано выше). Но составной первичный ключ не спасает, вполне реальна такая ситуация:

id-пользователя 1 id-пользователя 2 данные связи12...21...
Уникальности связи нет. Основные проблемы начинаются при модификации, надо анализировать по двум полям и на основе изменять (в целом, это не проблема, но как-то кривовато).
Ну сделайте как это реализовано во всех СУБД: таблица ГруппыПользователей с полями КодГруппы, Данные группы и таблица ПользователиГрупп с полями КодГруппы, КодПользователя, входящими в PK. Это даст Вам возможность объединять в группы при желании более 2 пользователей и простой способ контроля, модификации и получения информации по связям, причем пользователь будет искаться по одному полю, а не между двумя.

Пример поиска данных группы по 2 пользователям:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM ГруппыПользователей
WHERE 
  КодГруппы IN (
    SELECT КодГруппы
    FROM ПользователиГрупп 
    WHERE КодПользователя IN (<Пользователь1>, <Пользователь2>)
    GROUP BY КодГруппы
    HAVING Count(КодПользователя) =  2 
  )
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35848356
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TuP.S. читаю ман, но может кто-то знает, MySQL поддерживает CHECK CONSTRAINT или нет?Считайте, что нет.
CREATE TABLE Syntax
CREATE TABLE SyntaxThe CHECK clause is parsed but ignored by all storage engines.
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35848416
Tu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tu
Гость
ASCRUS,
возможно не плохое решение, но мне кажется, производительность будет хуже.
...
Рейтинг: 0 / 0
Связь таблицы с собой
    #35848897
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TuASCRUS,
возможно не плохое решение, но мне кажется, производительность будет хуже.
Я думаю она будет лучше, ибо изначально это решение можно назвать нормализацией и при существовании индексов на поля КодГруппы и КодПользователя все будет летать.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Связь таблицы с собой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]