|
|
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
Обычный случай: нужно хранить в базе связь между объектами (объект представляется строкой в таблице с уникальным идентификатором OBJ_ID). Нужно организовать логическую связь объекта много ко многим но так чтоб не зависело от направления связи. Физически можно организовать как таблицу (FROM_OBJ_ID, TO_OBJ_ID, LINK_TYPE_ID) - все внешние ключи, первичный уникальный ключь - все три поля. (третье - тип связи - ссылка на справочник) Для дого чтобы убрать направленность связи - триггер который при добавлении строки добавляет еще ее противоположное нарпвление или же проверяет есть обратная связь и если есть ругается... Ну приходят в голову и другие варианты с непринципиальными отличиями, но в любом случае не получается избавится от направленности связи на физическом уровне. Или можно? что-то ничего более разумного в голову не приходит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 15:45 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
orahome1Обычный случай: нужно хранить в базе связь между объектами (объект представляется строкой в таблице с уникальным идентификатором OBJ_ID). Нужно организовать логическую связь объекта много ко многим но так чтоб не зависело от направления связи. Физически можно организовать как таблицу (FROM_OBJ_ID, TO_OBJ_ID, LINK_TYPE_ID) - все внешние ключи, первичный уникальный ключь - все три поля. (третье - тип связи - ссылка на справочник) Для дого чтобы убрать направленность связи - триггер который при добавлении строки добавляет еще ее противоположное нарпвление или же проверяет есть обратная связь и если есть ругается... Ну приходят в голову и другие варианты с непринципиальными отличиями, но в любом случае не получается избавится от направленности связи на физическом уровне. Или можно? что-то ничего более разумного в голову не приходит... А для чего так извращаться? Если поля не символьные, то, что a=b, что b=a - воспринимается SQL одинаково... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 16:10 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
Храните (реализуется триггером) только FROM_OBJ_ID <=TO_OBJ_ID Соотвестсвенно в запросах, если нужно проверить (а, b) то where ... Наименьшее_из(а, b) = FROM_OBJ_ID and Наибольшее_из(а, b) =TO_OBJ_ID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 16:32 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
Link(LINK_ID,LINK_TYPE_ID) Points4Link(LINK_ID, OBJ_ID) Link (1,"я связь") Points4Link(1, ID_одного) Points4Link(1, ID_другого) и это можно заставить работать, но ... вот стоит ли овчинка выделки IMHO, Mon$te® ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 16:52 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
On Fri, 07 Dec 2007 15:45:44 +0300, orahome1 <nospam@sql.ru> wrote: > Обычный случай: нужно хранить в базе связь между объектами (объект > представляется строкой в таблице с уникальным идентификатором OBJ_ID). > Нужно организовать логическую связь объекта много ко многим но так чтоб > не зависело от направления связи. Links(fromId, toId, linkId). Хранится только связь в одном направлении, проверка наличия связи идет через ф-ию isLinkExists(fromId, toId, linkId), к-ая проверяет, есть ли в базе связь (fromId, toId) *или* (toId, fromId). > но в любом случае не получается избавится от направленности связи на > физическом уровне. Ну если на логическом уровне все чисто и красиво, можно забыть, как оно физически хранится. По крайней мере пока нет проблем с производительностью :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 18:02 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
ModelerR, спасибо - Ваш вариант триггера интереснее :) 4d_monster - В принципе такое решение я встречал на практике и оно хорошо для групповых связей (>2 объектов), но в данном случае наверно излишне. Ну в общем понято, что от физического уровня идеала ждать не приходится, просто хочется котроль целостности максимально вынести в базу и чтоб нагрузка минимальна была... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 18:21 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
Направление связи имеет слабую семантику. Обычно направленная связь означает, что возможен (или требуется) быстрый доступ к объекту на конце стрелки, но это не означает что к объекту в начале стрелки доступ невозможен. Просто для этого понадобится больше времени. Напрмер, может поребоваться полный перебор всех объектов сущности-потомка. Как тут отметили, в SQL запросах оператор a=b комутативен. Так что стрелка скорее напоминает о том, что связующие поля в реляционной БД должны быть проиндексированы. В общем случае в физической модели отсутствует часть сведений, содержащихся в логической модели. Собственно для того логическое моделирование и проводят, чтобы эти сведения зафиксировать в проектных документах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2007, 18:42 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
d ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2007, 22:48 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
А как оптимизировать хранение связей для получение всех объектов связанных с конкретным? (Направления связи нет. Есть просто связь) В этом случае без дублирования записей не обойтись? (Одна в одном направлении, другая в противоположном) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2007, 22:54 |
|
||
|
ненаправленая связь между объектами...
|
|||
|---|---|---|---|
|
#18+
BKVА как оптимизировать хранение связей для получение всех объектов связанных с конкретным ? (Направления связи нет. Есть просто связь) В этом случае без дублирования записей не обойтись ? (Одна в одном направлении, другая в противоположном) В этом случае дублировать записи не надо. А вот дублирование информации будет, но и это не самое страшное. В зависимости от ситуации, может возникнуть необходимость хранения не только прямых, но и косвенных связей (через потомка). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2007, 13:20 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=110&tid=1544125]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
87ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 429ms |

| 0 / 0 |
