|
|
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Возникла такая проблема. Есть несколько таблиц, которые описывают различные объекты. В каждой таблице ключ состоит из 4х полей (ID1, ID2, ID3,ID4). Есть таблица связей Relations, в которой хранятся составные ключи пары связанных объектов, типы объектов и тип связи, т.е. Relations ======= Object1_ID1 Object1_ID2 Object1_ID3 Object1_Id4 Object1_Type Object2_ID1 Object2_ID2 Object2_ID3 Object2_Id4 Object2_Type RelationType Связь объектов не иерархическая, т.е. если мы хотим выбрать все связанные объекты с данным, необходимо смотреть как в полях Object1, так и в полях Object2. Выбрать все связанные объекты не проблема. Проблема возникает при выборе несвязанных объектов, т.е. необходимо вывести пользователю список объектов, которые не связаны с данным, для того, чтобы он смох их привязать. Вопрос: как написать такой запрос, подскажите пожалуйста? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 17:12 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Alexander_FВ каждой таблице ключ состоит из 4х полей (ID1, ID2, ID3,ID4). Это сомнительное решение. Обычно в такой ситуации следует сделать дополнительный суррогатный ключ, а на эти четыре поля сделать альтернативный ключ, он же unique constraint. Alexander_FЕсть таблица связей Relations, в которой хранятся составные ключи пары связанных объектов, типы объектов и тип связи, т.е. То есть Вы вдобавок сделали денормализацию - вынесли поле "тип объекта" из таблицы объектов в таблицу связей? Уверены, что уместно? Alexander_FПроблема возникает при выборе несвязанных объектов, т.е. необходимо вывести пользователю список объектов, которые не связаны с данным, для того, чтобы он смох их привязать. Ключевое слово для поиска - antijoin. В зависимости от используемой СУБД оптимальная реализация может быть разной; самое простое Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 17:21 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 17:27 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Это вопрос все таки не по проектированию БД, а по реализации запроса в конкретной СУБД. А что касается проектирования, то тут действительно 4 ключевых поля громоздко слишком, если сделать суррогатный ключ, то и таблицы связей на 6 полей сократятся и запросы будут не так страшно выглядеть. Ну все от задачи естесно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2006, 18:46 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Я не совсем полно описал задачу. Исправляюсь. Каждый объект имеет свою таблицу. Например, документы, организации, лица: Document Organization Person ======= ========== ====== ID1 ID1 ID1 ID2 ID2 ID2 ID3 ID3 ID3 ID4 ID4 ID4 DocName OrgName PersonName ... ... ... В каждой таблице набор ключей ID1...ID4 свой. Согласен, что лучше иметь один ключ, чем 4. Возможно я так и сделаю, если будет много проблем, но пока структуру базы не хотелось бы менять. СУБД использую Oracle 9i, хотя честно говоря не вижу причины как это может зависить от СУБД, SQL-запрос получается классический. На сколько я понял, мне нужно идти от обратного, т.е. ,например, смотреть в таблице документов объекты, которых нет в таблице связей (Relations), причем смотреть как в полях Object1, так и в полях Object2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 09:40 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Проще всего Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 13:04 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Ну хорошо, допустим. Хотя я писал, что таблицы Objects нет, есть отдельная таблица для каждого объекта. А как из этого запроса, зная полученные ключи, получить полную информацию об объектах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 11:01 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Э, ну как Вы обычно это делаете - Join , IN и т.д. В SQL для этого достаточно средств, а про оптимизацию лучше спрашивать на форумах по конкретным СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 11:09 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
JOIN, IN - это понятно. Хотя IN не получится с составным ключем из 4-х полей. Можно конечно сделать отображение в одно поле... подумаю... А как можно прменить JOIN к вашему примеру? Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 11:27 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Разобрался. Вот пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 12:24 |
|
||
|
Как связать объекты?
|
|||
|---|---|---|---|
|
#18+
Alexander_FХотя IN не получится с составным ключем из 4-х полей Ну почему же. А если как-нибудь так? Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 12:45 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33634455&tid=1545343]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 458ms |

| 0 / 0 |
