powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Симметричность структуры данных
25 сообщений из 28, страница 1 из 2
Симметричность структуры данных
    #39859590
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные

Проблема возникает в выборках, если я хочу найти все записи по какому то пользователю, мне надо делать два прохода, искать по столбцу user1, потом по столбцу user2
А джоины с другими таблицами вообще кошмар.

Вариант1:
Все в одной таблице
user1, user2, данные
но при записи новых данных всегда пишем 2 строки, дублируя данные и меняя пользователей местами.
user1, user2, данные
user2, user1, данные

С выборками и джоинами все стало просто.
Но данные хранятся 2 раза, и мне это кажется каким то кривым решением.

Вариант3:
Чтобы избежать дублирования, и сохранить симметрию можно использовать вариант с 2мя таблицами:

1) id, данные
2) user, id в таблице с общими данными

Тут и симметрия, и нет избыточного хранения данных, но даже простейший запрос, получается каким то громоздким и по идее гораздо более медленным чем из варианта2.
Основной запрос к базе:
Известен пользователь, найти всех пользователей с которыми он связан и данные связи.

Задача должно быть типичная, и для нее наверное известно наилучшее решение?
подскажите.
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859597
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkaMitch,

По постановке задачи пользователи могут быть связаны не напрямую? Например user1-user2-данные1 и user2-user3-данные2? Судя по задаче планируется хранить граф связей между объектами?
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859603
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchесли я хочу найти все записи по какому то пользователю, мне надо делать два прохода,
искать по столбцу user1, потом по столбцу user2

"Чо?" (с)

У тебя в SQL кто-то удалил оператор OR?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859638
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L.OtujktdПо постановке задачи пользователи могут быть связаны не напрямую? Например user1-user2-данные1 и user2-user3-данные2? Судя по задаче планируется хранить граф связей между объектами?
Любые два пользователя могут быть связаны между собой.
Также, они могут быть связаны произвольное количество раз, разными данными описывающими эту связь.
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859640
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAkaMitchесли я хочу найти все записи по какому то пользователю, мне надо делать два прохода,
искать по столбцу user1, потом по столбцу user2

"Чо?" (с)

У тебя в SQL кто-то удалил оператор OR?

Давай, приведу пример, а ты покажешь как решить запрос в один проход при помощи OR.
Тк я реально не понимаю, как это сделать простым образом.

user1, user2, dataStrings - столбцы
вася, петя, hash1
петя, коля, hash2
макр, виктор, hash3

Мне надо выбрать все связи имеющиеся у "петя", вне зависимости от того
попал ли петя в user1 или в user2, нужный результат запроса в этом примере:
вася, hash1
коля, hash2
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859641
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L.OtujktdСудя по задаче планируется хранить граф связей между объектами?
Да точно, это не ориентированный граф получается по структуре.
С нюансом, что кроме самого наличия или отсутствия ребра графа, мне надо хранить еще информацию, описывающую каждое существующее ребро.

PS я не обнаружил возможности отредактировать даже только что написанное сообщение.
Подскажите, тут нет такой кнопки?
Или я ее не нашел?
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859650
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchDimitry Sibiryakovпропущено...

"Чо?" (с)

У тебя в SQL кто-то удалил оператор OR?

Давай, приведу пример, а ты покажешь как решить запрос в один проход при помощи OR.
Тк я реально не понимаю, как это сделать простым образом.

user1, user2, dataStrings - столбцы
вася, петя, hash1
петя, коля, hash2
макр, виктор, hash3

Мне надо выбрать все связи имеющиеся у "петя", вне зависимости от того
попал ли петя в user1 или в user2, нужный результат запроса в этом примере:
вася, hash1
коля, hash2
Код: sql
1.
2.
3.
select d.name as petya, case t.user1 when d.name then t.user2 else t.user1 end as ne_petya, t.dataStrings
from (select 'петя' as name from dual) d
  inner join table t on t.user1=d.name or t.user2=d.name
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859651
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitch я не обнаружил возможности отредактировать даже только что написанное сообщение.
Подскажите, тут нет такой кнопки?
Или я ее не нашел?
тут такой кнопки нет
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859662
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchмне надо делать два прохода, искать по столбцу user1, потом по столбцу user2
1. Не вижу в этом проблемы. Может быть проблемы будут в других запросах?
2. Один и тот же пользователь может быть указан в одной записи и в user1, и в user2?
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859663
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchL.OtujktdСудя по задаче планируется хранить граф связей между объектами?
Да точно, это не ориентированный граф получается по структуре.
С нюансом, что кроме самого наличия или отсутствия ребра графа, мне надо хранить еще информацию, описывающую каждое существующее ребро
В таком случае надо данные отделять от структуры графа. Чтобы при изменении структуры можно было не трогать сами данные.
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859798
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchМне надо выбрать все связи имеющиеся у "петя", вне зависимости от того
попал ли петя в user1 или в user2, нужный результат запроса в этом примере:
вася, hash1
коля, hash2
Код: sql
1.
2.
select user1, user2, dataStrings from ...
where user1='петя' or user2='петя'


При этом как бонус сохраняется информация является ли петя активным или пассивным
партнёром в связи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859817
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchВариант3:
Чтобы избежать дублирования, и сохранить симметрию можно использовать вариант с 2мя таблицами:

1) id, данные
2) user, id в таблице с общими данными

Тут и симметрия, и нет избыточного хранения данных
тут нет так называемой симметрии. Тут всяко-разно множественность. Можно запросто к одному id привязать десяток пользователей. А можно никого не привязать. На всё это надо писать дополнительные проверки.
Да и избыточность тоже присутствует. Из-за которой собственно и получается что даже простейший запрос, получается каким то громоздким

Так что самое верное решение - "оператор OR"
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859831
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchМне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные

Проблема возникает в выборках, если я хочу найти все записи по какому то пользователю, мне надо делать два прохода, искать по столбцу user1, потом по столбцу user2
А джоины с другими таблицами вообще кошмар.


И кстати, ты зря думаешь, что выборка в два прохода
Код: sql
1.
2.
3.
4.
5.
select t.user1 as petya, t.user2 as ne_petya, dataStrings
from table where t.user1='петя'
union all
select t.user2 as petya, t.user1 as ne_petya, dataStrings
from table where t.user2='петя' 


намного тяжелее чем если использовать другой вариант
Совсем не тяжелее, а в общем-то даже наоборот.
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859833
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.FontaineСовсем не тяжелее, а в общем-то даже наоборот.

Ну, может, у него индексов на user1 и user2 нет, тогда будет два full scan-а.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859900
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitch,

Делаете вьюху, в ней запрос наподобие того, что привел Mr.Fontaine, и ее уже используете в джойнах с другими таблицами.

Производительность может сильно зависеть от конкретной СУБД: например, в MSSQL вариант с UNION ALL предпочтительнее варианта с OR практически всегда.
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39859904
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможен еще вариант

1 таблица связи

id, Данные

2 таблица список user для связи

поле для id первой таблицы, id таблицы User

такая структура позволит иметь для каждой связи 2 и более user ))) Ну и запроc с exist
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860034
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RissВозможен еще вариант

1 таблица связи

id, Данные

2 таблица список user для связи

поле для id первой таблицы, id таблицы User

такая структура позволит иметь для каждой связи 2 и более user ))) Ну и запроc с exist
В первом посте у меня же этот вариант и описан вроде как "Вариант3"

Я об этом не думал ранее, но действительно такая структура позволит иметь для каждой связи произвольное количество user.. включая кстати и 1.
Что открывает дополнительный простор для ошибок в данных.
В идеале хотелось бы на уровне БД установить, что у каждой связи могут быть ровно 2 user, ни больше ни меньше, и еще они должны быть разными.

Всем кстати спасибо за ответы.
Получается, что "Вариант1" - это рекомендуемый метод для такой структуры данных?
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860056
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RissВозможен еще вариант

1 таблица связи

id, Данные

2 таблица список user для связи

поле для id первой таблицы, id таблицы User

такая структура позволит иметь для каждой связи 2 и более user ))) Ну и запроc с exist
Годная схема, кстати :)Реализовать вставку связи через хранимку и там валидацию реализовать
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860085
Mr.Fontaine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L.OtujktdRissВозможен еще вариант

1 таблица связи

id, Данные

2 таблица список user для связи

поле для id первой таблицы, id таблицы User

такая структура позволит иметь для каждой связи 2 и более user ))) Ну и запроc с exist
Годная схема, кстати :)Реализовать вставку связи через хранимку и там валидацию реализовать
Совсем даже негодная:
во-первых, она описана у автора тем в первом посте, и она ему уже тогда не нравилась.
Ибо как ты сам и пишешь, что структура позволит хранить любое количество user. Довольно часто мероприятия (хоть игры, хоть спорт) должны иметь определённое количество участников. И возможность записи произвольного количества просто недопустима. У автора темы это количество равно двум. Ни больше, ни меньше.
во-вторых, реализация вставки через хранимку тоже вызывает сомнения, ибо как запретить прямой insert в таблицу для связей?
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860244
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaineреализация вставки через хранимку тоже вызывает сомнения, ибо как запретить прямой insert
в таблицу для связей?

Это-то легко делается правильной раздачей прав.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860249
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Fontaineибо как запретить прямой insert в таблицу для связей?
Прямые операции с данными должны быть запрещены всегда, поддержание данных в правильном для бизнеса состоянии это задача приложения в целом и рассматривать таблицу в СУБД как нечто автономное не стоит, особенно не стоит реализовывать проверку сложных ограничений на триггерах, правильность данных обеспечивается и проверяется там где реализована бизнес логика.
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860279
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkaMitchМне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные



Ну, это конечно самый лучший вариант,
одно не понятно, в поле какого типа будут храниться ДАННЫЕ...

Надесь, TEXT ?
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860284
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
USER_LINK ( userlink_id, ....)

USER_LINK_USER (userlink_id, user_id)

USER_LINK_DATA_INT
(userlink_id, data int)

USER_LINK_DATA_CHAR
(userlink_id, data varchar)

и так далее...

Правда, я боюсь, что будет "джоины с другими таблицами вообще п#$@ц"
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860443
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAkaMitchМне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные



Ну, это конечно самый лучший вариант,
одно не понятно, в поле какого типа будут храниться ДАННЫЕ...

Надесь, TEXT ?
user1, user2 - INT, айдишники пользователей из таблицы с даными по пользователям.
данные - в реальности это 2 поля ip + datatime
...
Рейтинг: 0 / 0
Симметричность структуры данных
    #39860445
AkaMitch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изначально мне Вариант3 больше всего нравился,
по тому как данные выглядят в базе.

База кстати MySql.
Про хранимые процедуры раньше не думал, надо будет изучить этот вопрос.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Симметричность структуры данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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