Я храню дерево небольших строк в 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 поисков для каждого добавления или удаления, имеет ли это смысл, или это глупая идея?