|
|
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
Есть база данных такого вида: CREATE TABLE InfoTree ( ID AUTOINCLARGEINT ParentID LARGEINT DEFAULT -1 NOT NULL, Name WIDESTRING(1023) ); CREATE TABLE Tags ( TagID AUTOINCLARGEINT, TagName WIDESTRING(1023) ); CREATE TABLE TagDependancy ( TagID LARGEINT, ID LARGEINT ); Первая таблица содержит древовидную структуру данных (полей там побольше конечно, но в данном случае это не важно). Вторая таблица содержит список возможных тэгов и их уникальных идентификаторов. И третяя таблица содержит связи между записями главной таблицы и тэгами. Проект написан на Delphi, используется база данных Absolute Database. Для отображения используется компонент DevExpress TcxDBTreeList. Он автоматом отрисовывает дерево по таблице InfoTree на основе ID и ParentID. Мне дали этот проект доработать, необходимо добавить еще один TcxDBTreeList который будет показывать дерево тегов. Это дерево всегда двухуровневое. На первом уровне у него имена тэгов (Tags.TagName), на втором уровне имена элементов основной таблицы (InfoTree.Name) соответсвующие этому тэгу. Т.е. нужно построить таблицу c тремя полями: ID - уникальный идентификатор ParentID - родитель, для записей первого уровня (тэгов), он будет равен -1 Name - имя элемента, для первого уровня Tags.TagName, для второго соответсвенно InfoTree.Name Собственно вопрос, как это оптимально сделать? Если надо структуру всех таблиц можно переделать. В планах также переход на SQLite. Единственное, на что у меня хватит знаний сейчас это строить это таблицу вручную, бегая по таблицам в цикле, но думаю это не самый лучший вариант. Жду советов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2009, 03:20 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
TechnoDreamer, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2009, 12:17 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
olzhas, Предыдущий вариант это 2 уровневое дерево. Если хотите больше уровней с названием тегов на первом уровне тогда вот такой запрос. Правда я не знаю поддерживает ли Абсолют выражение case Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Все писалось руками так что могут быть ошибки, но думаю смысл вы поймете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2009, 12:21 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
Дело в том, что InfoTree.ID и Tags.TagID уникальные идентификаторы только в пределах своей таблицы. В вашем примере, в результирующей таблице могут быть повторяющиеся поля, а этого надо избежать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2009, 01:14 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
TechnoDreamer, Что мешает поставить уникальность на поля TagID,ID в таблице TagDependancy ? Так как только из-за нее может быть дублирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2009, 10:03 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
a.TagID (PK из Tags) вполне может совпасть с a.ID (PK из InfoTree) - тогда в результате запроса действительно будут повторяющиеся значения. А если так как-нибудь: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2009, 12:18 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
авторЧто мешает поставить уникальность на поля TagID,ID в таблице TagDependancy ? Так как только из-за нее может быть дублирование. Не понял вас :-) авторa.TagID (PK из Tags) вполне может совпасть с a.ID (PK из InfoTree) - тогда в результате запроса действительно будут повторяющиеся значения. А если так как-нибудь: Интересное решение, но к сожалению только половинчатое. Мы решаем проблему дубликатов a.TagID с a.ID. Но всё равно остаются дубликаты в случае когда одному ID соответствует несколько TagID, т.е. когда у элемента есть несколько тэгов. Думаю на основе существующих ключей эту проблему не решить, хоть могу и ошибаться. Но этого и не требуется. Надо видимо строить отдельную иерархию, вопрос только можно ли сделать это запросом на SQL (что бы СУБД этим занималась), или же мне придется строить ее самостоятельно в Дельфи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2009, 00:53 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
Для большей наглядности вложил пример. Дерево элементов многоуровневое. Элементам назначены некоторые теги (может быть несколько, а может вообще не быть). Внизу пример необходимого в результате дерева тэгов. В вашем решении из-за того что "Тэг 1" есть у двух элементов - получается неуникальный ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2009, 01:15 |
|
||
|
Построение таблицы для древовидной структуры
|
|||
|---|---|---|---|
|
#18+
Если цель сводится к тому, чтобы обеспечить уникальность идентификаторов в этой выборке, которая будет использоваться только для отображения в визуальном компоненте, то можно было бы добавить суррогатный первичный ключ к TagDependency Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2009, 15:45 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=85&tid=1543125]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 315ms |

| 0 / 0 |
