powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Модель связанных объектов. Проблемы выборки
36 сообщений из 36, показаны все 2 страниц
Модель связанных объектов. Проблемы выборки
    #38511739
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!

Есть несколько таблиц, связанных как 1:M. Таблица "А" - справочник пользователей, все последующие - связанные объекты. Таблица "B" содержит поле для связи с "А", таблица "C" - поле связи с "B", и т.д.

Чтобы узнать принадлежность объекта типа "C" пользователю (из таблицы "A") придётся найти связанный объект "B", затем перейти к "A". Проблема в том, что уровней "вложенности" объектов будет 5 или 6. В итоге, для выяснения принадлежности объекта "N" пользователю придётся джойнить все таблицы "вверх" до "B".
Пример: авторизованный пользователь открывает объект типа "N". Необходимо выяснить наличие прав (принадлежность) открываемого объекта по идентификатору пользователя.

Специфика проекта предусматривает частое чтение данных и редкую запись, поэтому есть такая идея: прокинуть поле ссылки на таблицу "A" по всем "подчинённым" таблицам, затем триггером проставлять значения (поднимаясь по всей схеме) при вставке.

Есть ли у вас другие варианты решения?
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38511767
Максим Н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219Доброго дня!

Есть несколько таблиц, связанных как 1:M. Таблица "А" - справочник пользователей, все последующие - связанные объекты. Таблица "B" содержит поле для связи с "А", таблица "C" - поле связи с "B", и т.д.

Чтобы узнать принадлежность объекта типа "C" пользователю (из таблицы "A") придётся найти связанный объект "B", затем перейти к "A". Проблема в том, что уровней "вложенности" объектов будет 5 или 6. В итоге, для выяснения принадлежности объекта "N" пользователю придётся джойнить все таблицы "вверх" до "B".
Пример: авторизованный пользователь открывает объект типа "N". Необходимо выяснить наличие прав (принадлежность) открываемого объекта по идентификатору пользователя.

Специфика проекта предусматривает частое чтение данных и редкую запись, поэтому есть такая идея: прокинуть поле ссылки на таблицу "A" по всем "подчинённым" таблицам, затем триггером проставлять значения (поднимаясь по всей схеме) при вставке.

Есть ли у вас другие варианты решения?

вы бы понизили уровень абстракции, а то сложно разобраться: A, B, C, N, что куда....
На каком-нибудь житейском примере.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38511771
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Максим Н,

Легко (просто хотел не напрягать предметной областью):

Пользователи - Поставщики - Поставки - Заказы (клиентские)

Так вот, пользователь отправляет запрос на открытие карточки клиентского заказа по номеру. Начинаем генерировать список возможных действий над заказом для пользователя. Открыть для просмотра можно только тот заказ, который относится к поставке от поставщика, которого зарегистрировал пользователь. Вот и получается уже два джойна: заказ - поставка и поставка - поставщик. В таблице поставщиков берем идентификатор пользователя (ссылка на родителя) и сверяем с данными авторизации.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38511807
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219Есть ли у вас другие варианты решения?

Если Ваш сервер позволяет materialized/indexed view - используйте их.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38511816
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин,

Нет, платформа - MySQL
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38511893
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы узнать принадлежность объекта типа "C" пользователю (из таблицы "A") придётся найти связанный объект "B", затем перейти к "A". Проблема в том, что уровней "вложенности" объектов будет 5 или 6. В итоге, для выяснения принадлежности объекта "N" пользователю придётся джойнить все таблицы "вверх" до "B".




это как раз не страшно.



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

а при join ить их потом очень просто.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512009
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219Есть ли у вас другие варианты решения?

Ты как бы чем занимаешься ? БД разрабатываешь ?
Вот и разрабатывай, пока про производительность не думай.
Потом поглядишь, если будет тормозить, и переделаешь.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512144
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Спасибо, Вы правы.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512264
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219... есть такая идея: прокинуть поле ссылки на таблицу "A" по всем "подчинённым" таблицам, затем триггером проставлять значения (поднимаясь по всей схеме) при вставке.
Идея бредовая. Одно дело если пользователей до 100. А если их больше?.. А их будет больше, просто об этом еще никто незнает.
Создание правильных индексов значительно облегчает жизнь.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512307
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр...Идея бредовая. Одно дело если пользователей до 100. А если их больше?.. А их будет больше, просто об этом еще никто незнает...
А как на такую схему повлияет количество пользователей? Пользователи добавляются в первую таблицу ("А"), созданные ими объекты записываются в подчинённые таблицы. При этом количество созданных объектов системы (то есть записей в подчинённых таблицах) не велико. А вот чтение из них - очень частая операция.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512318
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219,

Может я конечно и несовсем правильно понял (было б немлохо схему посмотреть), но в идее предлагается инсерт (триггером или скриптом - не столь важно) по объектам конкретного пользователя. Т.е. если в системе будет 3 пользователя то максимум одновременного инсерта - 3, если 100 то 100, ... Таким образом чем больше пользователей в системе тем выше шанс увеличения нагрузки при инсертах.
Собственно в примере с заказом вполне разумно держать в таблице заказа поле пользователя, а не вытягивать его через ...
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512370
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sender219,
Нужна отдельная таблица соответствия пользователей и объектов (групп объектов). Как ее поддерживать - вопрос отдельный
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512450
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модНужна отдельная таблица соответствия пользователей и объектов (групп объектов). Как ее поддерживать - вопрос отдельный
Чем это лучше варианта ТС-а?
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512465
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле незная целей и задач, не видя так сказать всей картины - сложно что-то утверждать. Поэтому абсолютно все вышесказанное относится к гаданию на кофейной гуще. Так что или автор попробует "разжевать", или пусть выбирает из "потока" то что ему нужно.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512754
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр...автор попробует "разжевать"...
Вот часть модели.

Особенности такие:
- вставка в orders - достаточно редкая операция (около 10 записей в месяц на пользователя).
- чтение из orders - операция частая. При этом, авторизованный пользователь (со своим user_id) открывает заказ из orders по order_id. Необходимо проверить принадлежность order к user.

Решение:
В таблицу orders добавляем поле user_id. Триггер на вставку в таблицу orders находит по указанному purchase_id через provider_id значение user_id и прописывает его в соответствующее поле.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512789
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ж сколько у вас тыщ мильенов записей, что нельзя 3-4 таблички заджоинить ?
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512800
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин Чем это лучше варианта ТС-а?
При изменении прав доступа не надо трогать сами объекты.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512806
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sender219Вот часть модели.
Пользователям даются права на провайдеров. Соответственно каждому пользователю д.б. видны только опереации с этим провайдером. Вот и вся нехитрая иерархия.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512882
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модКот Матроскин Чем это лучше варианта ТС-а?
При изменении прав доступа не надо трогать сами объекты.

У ТС-а это вроде бы не права доступа, а отношения владения. Если владелец обьекта вдруг изменился - нет ничего странного, что ссылка в обьекте изменится.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512898
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинУ ТС-а это вроде бы не права доступа, а отношения владения. Если владелец обьекта вдруг изменился - нет ничего странного, что ссылка в обьекте изменится.
Если так, то это другая задача ( мне не интересная)
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38512899
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин...У ТС-а это вроде бы не права доступа, а отношения владения...
Именно так.
Кот Матроскин...Если владелец обьекта вдруг изменился - нет ничего странного, что ссылка в обьекте изменится.
Владелец объекта не может быть изменён, поэтому нарушения значения поля "user_id" в таблице orders быть не может.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513048
trayal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользователь видит только "своих" поставщиков?
С поставщиком может работать только один пользователь?
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513134
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
trayal,

Да, именно так.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513336
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sender219Кот Матроскин...У ТС-а это вроде бы не права доступа, а отношения владения...
Именно так.

Все-таки это именно права доступа, а не просто атрибут объектов
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513399
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_мод,
это отношение владения, по которому [в том числе] однозначно строятся права доступа.

ТС же сказал, владелец у обьекта не меняется вообще никогда, т.е. аргумент
При изменении прав доступа не надо трогать сами объекты
- не имеет смысла.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513410
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскинэто отношение владения, по которому [в том числе] однозначно строятся права доступа.
Я предложил универсальную схему для прав доступа, в которой может меняться все. В реале так и происходит. А ТС просто не может сформулировать задачу.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513439
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модКот Матроскинэто отношение владения, по которому [в том числе] однозначно строятся права доступа.
Я предложил универсальную схему для прав доступа, в которой может меняться все.
Именно поэтому она не явлется хорошим решением для описанного случая - тут не "может меняться все", гибкость решения не приносит пользы, хотя по прежнему за нее надо платить свою цену (в данном случае - дополнительным обьектом базы, дополнительным обьемом данных, дополнительным join'ом в коде, необходимостью проверок "нет ли двух владельцев у обьекта?" и т.п.)
Логика "Для того чтобы вскипятить чайник, нужно налить в него воды, включить плиту, поставить чайник и дождаться кипения. Если в чайнике есть вода - выливаем ее и используем универсальное решение" - она плохая, негодная ;) Проектировщик сэкономил свои усилия, и вместо того чтобы подумать над конкретной задачей применил "универсальное решение"(tm), цену которого будут платить разработчики, dba и пользователи.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513465
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинИменно поэтому она не явлется хорошим решением для описанного случая
Этот случай типовой и решение тоже типовое. Отдельная таблица с индексами по user и объект - самый эффективный способ. Все остальное дороже.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513514
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модКот МатроскинИменно поэтому она не явлется хорошим решением для описанного случая
. Отдельная таблица с индексами по user и объект - самый эффективный способ. Все остальное дороже.

ээ, эффективный в чем?
у меня получилось, (user - ~5К записей, Object ~220k) что запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
select o.objectID
from _user u
     join _Object1_user ou 
     on ou.UserID = u.UserID
     join _object1 o
     on ou.ObjectID = o.ObjectID
where u.UserID = @UserID


примерно в полтора раза уступает
Код: sql
1.
2.
3.
4.
5.
select objectid
from _#user u with (index = iuser)
     join _#object2 o
     on o.UserID1 = U.UserID
where u.UserID =  @UserID



и такая же картинка - при поиске по ObjectID

Единственно когда второй запрос проигрывает - когда нет индексов на таблицах object1, object2 (поскольку происходит table scan, и по object2 за счет лишнего поля надо просто больше страниц читать.)
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513516
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин,

пардон, сорвалось сообщение раньше, не почистил второй запрос с именами таблиц и хинтом- хинт там роли не играет, что с хинтом что без хинта результат одинаковый.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513528
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219,

Блин. Или я туплю или ... А описание модели где? Или это озвученное выше "Пользователи - Поставщики - Поставки - Заказы (клиентские)" ?
Если озвученное выше то уберите из providers user_id. Сделайте таблицу providers_user (provider_id, user_id, ...). Можете в нее еще добавить дату начала и дату конца, тогда сможете организовать историю изменения пользователя для данного поставщика. В таблице orders поле purchase_id явно лишнее, можете смело убирать.
И если приводите схему то отображайте все элементы таблиц, это избавит от непоняток (в данном случае я непытаюсь угадать что у вас там еще скрыто).
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513827
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр...Сделайте таблицу providers_user (provider_id, user_id, ...)...
Зачем? Если отношение между ними 1-М, зачем мне переходить на М-М?
По условию поставщик принадлежит только одному пользователю. И у одного пользователя может быть много собственных (личных) поставщиков.

Злой Бобр...В таблице orders поле purchase_id явно лишнее, можете смело убирать...

А это зачем? Если по каждой поставке (purchases) может быть ноль или М заказов (orders).

В целом картина такова: каждый пользователь системы ведёт собственный каталог поставщиков. По каждому своему поставщику пользователь формирует поставки. По каждой поставке может быть сформировано М заказов.

Злой Бобр...И если приводите схему то отображайте все элементы таблиц, это избавит от непоняток (в данном случае я непытаюсь угадать что у вас там еще скрыто).

Скрыты атрибуты, не имеющие отношения к вопросу. Свойства пользователя, поставщика и т.д.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513879
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин
При условии:
По условию поставщик принадлежит только одному пользователю
вы правы.
Но условие сомнительное :)
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513901
sender219
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_мод...Но условие сомнительное :)...
Согласен. Вообще система достаточно специфична. Именно поэтому и старался здесь абстрагироваться от предметной области, с таблицами A, B, C ... N.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38513952
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sender219 Вообще система достаточно специфична.
Такие системы крайняя редкость. Не думаю, что ваша к ним принадлежит. Поэтому и нужно применять типовые решения.
зы Как правило, юзер, создавший объект, фиксируется в аудите. Этим можно воспользоваться.
...
Рейтинг: 0 / 0
Модель связанных объектов. Проблемы выборки
    #38514412
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sender219Злой Бобр...Сделайте таблицу providers_user (provider_id, user_id, ...)...
Зачем? Если отношение между ними 1-М, зачем мне переходить на М-М?
По условию поставщик принадлежит только одному пользователю. И у одного пользователя может быть много собственных (личных) поставщиков.
Зачем - я написал выше (что б видеть историю если у поставщика меняется пользователь). Но если вас устраивает что при изменении пользователя вы тупо перепишите поля таблицы (вместо Петров напишете в ФИО Сидоров) - невопрос, это ваша кухня и вам там рулить. Если считаете что пользователь будет жить вечно - это тоже ваше дело.
Я вовсе не претендую на мнение последней инстанции. Все что тут пишется носит лишь рекомендательный характер. Конечный выбор за вами.
sender219Злой Бобр...В таблице orders поле purchase_id явно лишнее, можете смело убирать...
А это зачем? Если по каждой поставке (purchases) может быть ноль или М заказов (orders).
В целом картина такова: каждый пользователь системы ведёт собственный каталог поставщиков. По каждому своему поставщику пользователь формирует поставки. По каждой поставке может быть сформировано М заказов.
Ну тогда я неправильно понял смысл поставки. У вас это оказывается сводный заказ по клиентам, а я "телепартировал" что это аналог Партии. Увы, отсутствие описания дает подобные казусы.
sender219Злой Бобр...И если приводите схему то отображайте все элементы таблиц, это избавит от непоняток (в данном случае я непытаюсь угадать что у вас там еще скрыто).
Скрыты атрибуты, не имеющие отношения к вопросу. Свойства пользователя, поставщика и т.д.
Опять же это лишь рекомендация. Хотите удивляться почему вам рекомендуют то что явно невписывается в вашу задачу - можете и дальше вырывать куски из контекста, а мы будем "телепартировать".
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Модель связанных объектов. Проблемы выборки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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