|
|
|
Вопрос по организации взаимосвязей между сущностями
|
|||
|---|---|---|---|
|
#18+
Хочу поинтересоваться вашим мнением по следующему вопросу. В базе есть сущности, сущности связаны между собой отношениями много-ко-многим следующим образом. Пусть 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. Собственно счетчик мне не интересен. На выходе мне нужно только знать в каких ролях выступала сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2003, 16:01 |
|
||
|
Вопрос по организации взаимосвязей между сущностями
|
|||
|---|---|---|---|
|
#18+
Просто вставлять и удалять связки не пользуя счетчик - не пойдет. Сейчас в таблице около 14000 записей, сумма всех счетчиков - около 90000. И это еще цветочки... Бегать потом пусть и с битмэп индексом по таблице с миллионами строк - не здорово. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2003, 16:07 |
|
||
|
Вопрос по организации взаимосвязей между сущностями
|
|||
|---|---|---|---|
|
#18+
Уточни, у тебя одна таблица отношений, или на каждое отношение своя таблица? Далее, множества идентификаторов {A_ID}, {B_ID}, ..., {Z_ID} не пересекаются? Т.е. каждая запись в объединении этих множеств имеет уникальный идентификатор? Мне нравится следующий вариант: все сущности являются наследниками некоей одной единой, т.е. существует таблица со всеми идентификаторами, все остальные связаны с ней идентифицирующей связью. Далее, есть одна таблица отношений, два идентификатора родительской сущности и тип связи. При таком построении БД скорость выборки из таблицы связей ИМХО будеть приемлема при больших объемах, при наличии соответствующих индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2003, 22:40 |
|
||
|
Вопрос по организации взаимосвязей между сущностями
|
|||
|---|---|---|---|
|
#18+
Второй вариант связан с управляемым уменьшением достоверности данных, мы делали нечто подобное для поиска по параметрам изменяемого списка товаров. В твоем случае, при изменении таблиц(ы) отношений не производится моментальная корректировка сводной таблицы-счетчика, просто факт изменения записи заносится в некий лог. Для уменьшения числа блокировок это можно делать в автономной транзакции, либо постоить таблицу-лог таким образом, чтобы несколько сессий априори не блокировали друг друга: к примеру, записи в нее только вставляются и удаляются - первичный ключ через sequence, никаких ссылок и ограничений уникальности - но никогда не изменяются. Разбог лога, или логов, производится на job-е, который и корректирует счетчик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2003, 00:32 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32099995&tid=1991970]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
291ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 610ms |

| 0 / 0 |
