Гость
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Симметричность структуры данных / 25 сообщений из 28, страница 1 из 2
09.09.2019, 21:36
    #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
09.09.2019, 21:51
    #39859597
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
AkaMitch,

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

"Чо?" (с)

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

"Чо?" (с)

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

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

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

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

PS я не обнаружил возможности отредактировать даже только что написанное сообщение.
Подскажите, тут нет такой кнопки?
Или я ее не нашел?
...
Рейтинг: 0 / 0
10.09.2019, 06:43
    #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
10.09.2019, 06:45
    #39859651
Mr.Fontaine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
AkaMitch я не обнаружил возможности отредактировать даже только что написанное сообщение.
Подскажите, тут нет такой кнопки?
Или я ее не нашел?
тут такой кнопки нет
...
Рейтинг: 0 / 0
10.09.2019, 08:23
    #39859662
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
AkaMitchмне надо делать два прохода, искать по столбцу user1, потом по столбцу user2
1. Не вижу в этом проблемы. Может быть проблемы будут в других запросах?
2. Один и тот же пользователь может быть указан в одной записи и в user1, и в user2?
...
Рейтинг: 0 / 0
10.09.2019, 08:24
    #39859663
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
AkaMitchL.OtujktdСудя по задаче планируется хранить граф связей между объектами?
Да точно, это не ориентированный граф получается по структуре.
С нюансом, что кроме самого наличия или отсутствия ребра графа, мне надо хранить еще информацию, описывающую каждое существующее ребро
В таком случае надо данные отделять от структуры графа. Чтобы при изменении структуры можно было не трогать сами данные.
...
Рейтинг: 0 / 0
10.09.2019, 12:57
    #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
10.09.2019, 13:16
    #39859817
Mr.Fontaine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
AkaMitchВариант3:
Чтобы избежать дублирования, и сохранить симметрию можно использовать вариант с 2мя таблицами:

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

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

Так что самое верное решение - "оператор OR"
...
Рейтинг: 0 / 0
10.09.2019, 13:32
    #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
10.09.2019, 13:36
    #39859833
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
Mr.FontaineСовсем не тяжелее, а в общем-то даже наоборот.

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

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

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

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

id, Данные

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

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

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

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

id, Данные

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

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

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

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

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

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

id, Данные

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

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

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

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

id, Данные

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

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

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

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



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

Надесь, TEXT ?
...
Рейтинг: 0 / 0
11.09.2019, 13:27
    #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
11.09.2019, 17:18
    #39860443
AkaMitch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность структуры данных
MasterZivAkaMitchМне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные



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

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

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


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