Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
Мне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные

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

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

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

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

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

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

Задача должно быть типичная, и для нее наверное известно наилучшее решение?
подскажите.
9 сен 19, 21:36    [21967290]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
L.Otujktd
Member

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

По постановке задачи пользователи могут быть связаны не напрямую? Например user1-user2-данные1 и user2-user3-данные2? Судя по задаче планируется хранить граф связей между объектами?
9 сен 19, 21:51    [21967300]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

AkaMitch
если я хочу найти все записи по какому то пользователю, мне надо делать два прохода,
искать по столбцу user1, потом по столбцу user2

"Чо?" (с)

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

Posted via ActualForum NNTP Server 1.5

9 сен 19, 22:11    [21967310]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
L.Otujktd
По постановке задачи пользователи могут быть связаны не напрямую? Например user1-user2-данные1 и user2-user3-данные2? Судя по задаче планируется хранить граф связей между объектами?

Любые два пользователя могут быть связаны между собой.
Также, они могут быть связаны произвольное количество раз, разными данными описывающими эту связь.
10 сен 19, 02:03    [21967380]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
Dimitry Sibiryakov
AkaMitch
если я хочу найти все записи по какому то пользователю, мне надо делать два прохода,
искать по столбцу user1, потом по столбцу user2

"Чо?" (с)

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

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

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

Мне надо выбрать все связи имеющиеся у "петя", вне зависимости от того
попал ли петя в user1 или в user2, нужный результат запроса в этом примере:
вася, hash1
коля, hash2
10 сен 19, 02:10    [21967382]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
L.Otujktd
Судя по задаче планируется хранить граф связей между объектами?

Да точно, это не ориентированный граф получается по структуре.
С нюансом, что кроме самого наличия или отсутствия ребра графа, мне надо хранить еще информацию, описывающую каждое существующее ребро.

PS я не обнаружил возможности отредактировать даже только что написанное сообщение.
Подскажите, тут нет такой кнопки?
Или я ее не нашел?
10 сен 19, 02:18    [21967383]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
AkaMitch
Dimitry Sibiryakov
пропущено...

"Чо?" (с)

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

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

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

Мне надо выбрать все связи имеющиеся у "петя", вне зависимости от того
попал ли петя в user1 или в user2, нужный результат запроса в этом примере:
вася, hash1
коля, hash2

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
10 сен 19, 06:43    [21967397]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
AkaMitch
я не обнаружил возможности отредактировать даже только что написанное сообщение.
Подскажите, тут нет такой кнопки?
Или я ее не нашел?

тут такой кнопки нет
10 сен 19, 06:45    [21967398]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20059
AkaMitch
мне надо делать два прохода, искать по столбцу user1, потом по столбцу user2

1. Не вижу в этом проблемы. Может быть проблемы будут в других запросах?
2. Один и тот же пользователь может быть указан в одной записи и в user1, и в user2?
10 сен 19, 08:23    [21967417]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20059
AkaMitch
L.Otujktd
Судя по задаче планируется хранить граф связей между объектами?

Да точно, это не ориентированный граф получается по структуре.
С нюансом, что кроме самого наличия или отсутствия ребра графа, мне надо хранить еще информацию, описывающую каждое существующее ребро

В таком случае надо данные отделять от структуры графа. Чтобы при изменении структуры можно было не трогать сами данные.
10 сен 19, 08:24    [21967418]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

AkaMitch
Мне надо выбрать все связи имеющиеся у "петя", вне зависимости от того
попал ли петя в user1 или в user2, нужный результат запроса в этом примере:
вася, hash1
коля, hash2

select user1, user2, dataStrings from ...
where user1='петя' or user2='петя'

При этом как бонус сохраняется информация является ли петя активным или пассивным
партнёром в связи.

Posted via ActualForum NNTP Server 1.5

10 сен 19, 12:57    [21967660]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
AkaMitch
Вариант3:
Чтобы избежать дублирования, и сохранить симметрию можно использовать вариант с 2мя таблицами:

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

Тут и симметрия, и нет избыточного хранения данных

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


Так что самое верное решение - "оператор OR"
10 сен 19, 13:16    [21967692]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
AkaMitch
Мне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные

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


И кстати, ты зря думаешь, что выборка в два прохода
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='петя' 

намного тяжелее чем если использовать другой вариант
Совсем не тяжелее, а в общем-то даже наоборот.
10 сен 19, 13:32    [21967711]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

Mr.Fontaine
Совсем не тяжелее, а в общем-то даже наоборот.

Ну, может, у него индексов на user1 и user2 нет, тогда будет два full scan-а.

Posted via ActualForum NNTP Server 1.5

10 сен 19, 13:36    [21967714]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Ennor Tiegael
Member

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

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

Производительность может сильно зависеть от конкретной СУБД: например, в MSSQL вариант с UNION ALL предпочтительнее варианта с OR практически всегда.
10 сен 19, 15:31    [21967819]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Riss
Member

Откуда:
Сообщений: 198
Возможен еще вариант

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

id, Данные

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

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

такая структура позволит иметь для каждой связи 2 и более user ))) Ну и запроc с exist
10 сен 19, 15:36    [21967824]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
Riss
Возможен еще вариант

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

id, Данные

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

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

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

В первом посте у меня же этот вариант и описан вроде как "Вариант3"

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

Всем кстати спасибо за ответы.
Получается, что "Вариант1" - это рекомендуемый метод для такой структуры данных?
10 сен 19, 20:26    [21968103]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
Riss
Возможен еще вариант

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

id, Данные

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

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

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

Годная схема, кстати :)Реализовать вставку связи через хранимку и там валидацию реализовать
10 сен 19, 22:52    [21968164]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
L.Otujktd
Riss
Возможен еще вариант

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

id, Данные

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

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

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

Годная схема, кстати :)Реализовать вставку связи через хранимку и там валидацию реализовать

Совсем даже негодная:
во-первых, она описана у автора тем в первом посте, и она ему уже тогда не нравилась.
Ибо как ты сам и пишешь, что структура позволит хранить любое количество user. Довольно часто мероприятия (хоть игры, хоть спорт) должны иметь определённое количество участников. И возможность записи произвольного количества просто недопустима. У автора темы это количество равно двум. Ни больше, ни меньше.
во-вторых, реализация вставки через хранимку тоже вызывает сомнения, ибо как запретить прямой insert в таблицу для связей?
11 сен 19, 06:36    [21968201]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

Mr.Fontaine
реализация вставки через хранимку тоже вызывает сомнения, ибо как запретить прямой insert
в таблицу для связей?

Это-то легко делается правильной раздачей прав.

Posted via ActualForum NNTP Server 1.5

11 сен 19, 12:35    [21968435]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
iOracleDev
Member

Откуда:
Сообщений: 428
Mr.Fontaine
ибо как запретить прямой insert в таблицу для связей?

Прямые операции с данными должны быть запрещены всегда, поддержание данных в правильном для бизнеса состоянии это задача приложения в целом и рассматривать таблицу в СУБД как нечто автономное не стоит, особенно не стоит реализовывать проверку сложных ограничений на триггерах, правильность данных обеспечивается и проверяется там где реализована бизнес логика.
11 сен 19, 12:43    [21968441]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34537
AkaMitch
Мне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные



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

Надесь, TEXT ?
11 сен 19, 13:23    [21968481]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34537
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)

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

Правда, я боюсь, что будет "джоины с другими таблицами вообще п#$@ц"
11 сен 19, 13:27    [21968486]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
MasterZiv
AkaMitch
Мне надо сохранять в базу связь двух пользователей между собой, и данные по этой связи.
Вариант1:
Все в одной таблице
user1, user2, данные



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

Надесь, TEXT ?

user1, user2 - INT, айдишники пользователей из таблицы с даными по пользователям.
данные - в реальности это 2 поля ip + datatime
11 сен 19, 17:18    [21968705]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
AkaMitch
Member

Откуда:
Сообщений: 10
Изначально мне Вариант3 больше всего нравился,
по тому как данные выглядят в базе.

База кстати MySql.
Про хранимые процедуры раньше не думал, надо будет изучить этот вопрос.
11 сен 19, 17:21    [21968709]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
Mr.Fontaine
L.Otujktd
пропущено...

Годная схема, кстати :)Реализовать вставку связи через хранимку и там валидацию реализовать

Совсем даже негодная:
во-первых, она описана у автора тем в первом посте, и она ему уже тогда не нравилась.
Ибо как ты сам и пишешь, что структура позволит хранить любое количество user. Довольно часто мероприятия (хоть игры, хоть спорт) должны иметь определённое количество участников. И возможность записи произвольного количества просто недопустима. У автора темы это количество равно двум. Ни больше, ни меньше.
во-вторых, реализация вставки через хранимку тоже вызывает сомнения, ибо как запретить прямой insert в таблицу для связей?

Кто делает прямой инсерт получает удар током:) На уровне прав, конечно
11 сен 19, 18:55    [21968829]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 758
L.Otujktd, ок, согласен.
Выполнять процедуру под специальным пользователем и только ему дать права на insert.
Вполне вариант, о котором я сразу не подумал.
12 сен 19, 07:35    [21969080]     Ответить | Цитировать Сообщить модератору
 Re: Симметричность структуры данных  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

Mr.Fontaine
Выполнять процедуру под специальным пользователем

Обычно в СУБД таких прыжков в ширину не требуется. Права либо выдаются самой процедуре
либо наследуются ею от создателя.

Posted via ActualForum NNTP Server 1.5

12 сен 19, 12:41    [21969335]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Проектирование БД Ответить