Я на перекрестке, решив, должны ли теги быть их собственным ресурсом или вложенным свойством заметки. Этот вопрос немного затрагивает дизайн RESTful и хранилище баз данных.
Контекст: У меня есть ресурс заметок. У пользователей может быть много заметок. Каждая заметка может иметь много тегов.
Функциональные цели:
Мне нужно создать маршруты, чтобы сделать следующее:
1) Получить все пользовательские теги. Что-то вроде: GET /users/:id/tags
2) Удалить тег (ы), связанный с запиской.
3) Добавьте тег к определенной заметке.
Цели данных/производительности
1) Получение пользовательских тегов должно быть быстрым. Это делается для "автозагрузки" / "автозаполнения".
2) Предотвратите дубликаты (как можно больше). Я хочу, чтобы теги были повторно использованы как можно больше, чтобы иметь возможность запрашивать данные по тегу. Например, я хотел бы смягчить сценарии, когда пользователь вводит тег, такой как "супергерои", когда тег "супергерой" уже существует.
При этом, как я вижу это, есть два подхода к хранению тегов на ресурсе заметки:
1) в качестве вложенного свойства. Например:
type: 'notes',
attributes: {
id: '123456789',
body: '...',
tags: ['batman', 'superhero']
}
2) в качестве собственного ресурса. Например:
type: 'notes',
data: {
id: '123456789',
body: '...',
tags: [1,2,3] // <= Tag IDs instead of strings
}
Любой из вышеперечисленных подходов мог бы работать, но я ищу решение, которое позволит масштабируемость и согласованность данных (представьте себе миллион заметок и десять миллионов тегов). На данный момент я склоняюсь к варианту №1, так как легче справиться с кодом, но может и не быть правильным вариантом.
Мне очень интересно услышать некоторые мысли о разных подходах, особенно потому, что я не могу найти похожие вопросы по поводу этой темы.
Обновление Спасибо за ответы. Одна из самых важных вещей для меня - это определение того, почему использование одного над другим выгодно. Я бы хотел, чтобы в ответ был включен список pro/con.