При хранении дерева в Postgres я должен использовать рекурсивный запрос, чтобы найти всех родителей и детей, или сохранить их идентификаторы в массиве? - PullRequest
0 голосов
/ 11 ноября 2018

Я храню дерево небольших строк в Postgres. Это выглядит так:

"Languages"
    |
    |--- "French"
            |
            |--- "Verbs"
            |--- "Pronunciation"
    |--- "German"
            |
            |--- "Pronunciation"
            |--- "Cuisine"
"Music"
   |
   |--- "Guitar"
   |--- "Voice"
           |
           |--- "Breathing Exercises"
"Reminders"
"Vehicles"
   |
   |--- "Car"
          |
          |--- "Road Rules"
                    |
                    |--- "Fines"
                    |--- "Highways"
   |--- "Bike"
           |
           |--- "Repair Guide"

Вы поняли идею. Это имена тегов; будет еще одна таблица, полная карточек / заметок, каждая из которых связана с одним или несколькими из этих тегов. Например, одна заметка может быть помечена Languages.French.Verbs и Reminders, или заметка о королеве Елизавете может быть помечена People.Historical и Countries.UK.History (где . обозначает уровень в иерархии). В моем приложении я хочу просмотреть список тегов и связанных с ними заметок, таких как файловая система (теги как папки, заметки как файлы внутри них) и увидеть одну и ту же заметку, появляющуюся в нескольких точках из-за этих нескольких тегов.

Я изучал Postgres, с которым я не очень хорошо знаком (мои классы использовали SQLite), и я могу представить два способа сделать это - но я не уверен, что является идеальным / правильным или что Компромиссы есть. Буду признателен за некоторые советы по этому поводу.

Когда пользователь ищет некоторые заметки (по имени тега, заголовку заметки или текстовому содержимому), я хочу показать им список результатов и полную иерархию тегов, связанных с этой заметкой. Например, они ищут «Элизабет», и заметка № 1 помечается People.Historical и Countries.UK.History. Если я получу результаты поиска, выполнив поиск в их таблице заметок, и каждая заметка сохранит один родительский идентификатор, то как мне эффективно создать полные имена тегов?

Должен ли я хранить родительский идентификатор с каждым тегом и выполнять рекурсивные запросы? Обязательно ли это будет отдельный рекурсивный запрос для каждого тега конечного узла, который я ищу (как в одном запросе для History и его родительских и один для Historical)?

Было бы лучше, если бы я хранил два массива с каждым тегом, один с детьми и один с родителями? Это позволит избежать необходимости выполнять сложные поиски каждый раз, но добавление и удаление дочерних элементов станет более сложным. Если я ожидаю сделать 100 поисков для каждого добавления или удаления, имеет ли это смысл, или это глупая идея?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...