powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по организации взаимосвязей между сущностями
4 сообщений из 4, страница 1 из 1
Вопрос по организации взаимосвязей между сущностями
    #32099994
JohnSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу поинтересоваться вашим мнением по следующему вопросу. В базе есть сущности, сущности связаны между собой отношениями много-ко-многим следующим образом. Пусть A и B - сущности, тогда между ними определена связка (таблица) A_B_Role (
A_ID NOT NUL REFERENCES A (ID) ON DELETE ...,
B_ID NOT NUL REFERENCES B (ID) ON DELETE ...,
Role_ID NOT NULL REFERENCES Role (ID) ON DELETE.,
);
где Role - словарь ролей (типов отношений). Все замечательно. Допустим у нас есть 4 сувщности, тогда между ними возможно 10 различных бинарных связок. Для одной из сущностей (C) надо знать, в каких ролях она выступает по отношению к другим. Т.е. необходима сумма Role по всем 10 связкам. Запрос такой выпонять неэффективно, поэтому я в свое время создал и табличку C_Role (
C_ID NOT NULL REFERENCES C (ID),
Role_ID NOT NULL REFERENCES Role (ID),
Counter NOT NULL NUMBER
). Смысл тривиален - для каждой сущности C можно узнать сколько раз и в каких ролях она выступала. На все связки повешены тривиальный триггеры, вставляющие и удаляющие строки этой таблицы. Например вставляется
A_C_Role - идем в C_Role, смотрим есть ли там строка WHERE C_ID = &c_id AND Role_ID = &role_id. Если нет - вставляем, если есть - увеличиываем счетчик на еденицу. Подход тривиальный, но имеет БОЛЬШОЙ НЕДОСТАТОК - блокироки при UPDATE, из-за которых постоянно виснут транзакции. Если сталкивались с подобными задачами, расскажите, плз, какие еще есть решения. P.S. Собственно счетчик мне не интересен.
На выходе мне нужно только знать в каких ролях выступала сущность.
...
Рейтинг: 0 / 0
Вопрос по организации взаимосвязей между сущностями
    #32099995
JohnSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто вставлять и удалять связки не пользуя счетчик - не пойдет. Сейчас в таблице около 14000 записей, сумма всех счетчиков - около 90000. И это еще цветочки... Бегать потом пусть и с битмэп индексом по таблице с миллионами строк - не здорово.
...
Рейтинг: 0 / 0
Вопрос по организации взаимосвязей между сущностями
    #32100020
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточни, у тебя одна таблица отношений, или на каждое отношение своя таблица? Далее, множества идентификаторов {A_ID}, {B_ID}, ..., {Z_ID} не пересекаются? Т.е. каждая запись в объединении этих множеств имеет уникальный идентификатор?

Мне нравится следующий вариант: все сущности являются наследниками некоей одной единой, т.е. существует таблица со всеми идентификаторами, все остальные связаны с ней идентифицирующей связью. Далее, есть одна таблица отношений, два идентификатора родительской сущности и тип связи. При таком построении БД скорость выборки из таблицы связей ИМХО будеть приемлема при больших объемах, при наличии соответствующих индексов.
...
Рейтинг: 0 / 0
Вопрос по организации взаимосвязей между сущностями
    #32100025
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй вариант связан с управляемым уменьшением достоверности данных, мы делали нечто подобное для поиска по параметрам изменяемого списка товаров. В твоем случае, при изменении таблиц(ы) отношений не производится моментальная корректировка сводной таблицы-счетчика, просто факт изменения записи заносится в некий лог. Для уменьшения числа блокировок это можно делать в автономной транзакции, либо постоить таблицу-лог таким образом, чтобы несколько сессий априори не блокировали друг друга: к примеру, записи в нее только вставляются и удаляются - первичный ключ через sequence, никаких ссылок и ограничений уникальности - но никогда не изменяются. Разбог лога, или логов, производится на job-е, который и корректирует счетчик.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по организации взаимосвязей между сущностями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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