Привет! Подскажите пожалуйста, как будет корректнее: к примеру, есть две

сущности - КНИГА и ЖАНР

У каждой книги есть жанр.
Задача: нужно получить все книги по жанру. Чтобы это сделать нужно с клиента отправлять id жанра, пусть оно равно genreID

Как я понимаю, чтобы реализовать это у нас есть два варианта:
1. Хранить в сущности Книги поле genreID
либо
2. Хранить в сущности Жанра поле books, хранящее массив из bookID, принадлежащие жанру.

Реализация:
// Напомню, genreID приходит с клиента.
1. Book.find({ genreID: genreID }) => выдаст все книги, у которых поле genreID === genreID
либо
2. Genre.findById(genreID) => выдаст один Жанр. Жанр имеет поле books => можно сделать
Book.find({ _id: books })

Оба варианта, по сути, должны вернуть одинаковый результат. Но какой подход будет проще с точки зрения расширения приложения и оптимизации?

7 ответов

12 просмотров

если у вас нет плана по дальнейшему развитию - как первый так и второй, так тритий и даже четвертый, кторые решают конкретные проблемы на уже разросшихся проекта с зафиксированной функциональностью. Такчто выбирайте как вам сейчас удобнее и просто закладывайте время на полную перестройку структуры БД когда все неявное оперделится

Амир- Автор вопроса
Nick
если у вас нет плана по дальнейшему развитию - как...

спасибо! ответ в принципе логичный. но если все таки выбирать из двух зол оптимальное?

Амир
спасибо! ответ в принципе логичный. но если все та...

первое, это стандартный подход в реляционных БД, который уже полвека существует и до появления проблем с производительностью и менеджерством структуры бд очень удобен. Второй уже прямо сейчас может создать для вас проблемы, т.к. почемуто при добавлении книги вам зачемто нужно обновлять данные целого жанра

Амир- Автор вопроса
Nick
первое, это стандартный подход в реляционных БД, к...

вы совершенно правы. огромное спасибо за развернутый ответ!)

Амир
вы совершенно правы. огромное спасибо за развернут...

еще можно посмотреть немного с другой стороны, отвлеченно от БД. Жанр книги - это ее свойство, причем субъективное, в первом варианте как раз так и описываете в БД. Во втором же получается что жанр знает о книгах, т.е. условно жанр определяет какие книги к нему относятся, а не по содержимому книги мы определяем к какому жанру его отнести.

Амир- Автор вопроса
Nick
еще можно посмотреть немного с другой стороны, отв...

да, это так правильно и очевидно. все это было в голове в похожем виде, но никак не мог объяснить почему второй вариант плох. очень рад, что есть такие чаты и люди, как вы, готовые помогать) 🙏🏼

Амир
да, это так правильно и очевидно. все это было в г...

Думаю, лучше наоборот, в коллекции books хранить список ganreIds.

Похожие вопросы

Обсуждают сегодня

Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
всем привет помогите пожалуйста используя CDN (GCP) у игроков из вьетнама загружается конфиг (размер 999 bytes) загружается 5 и более минут н а других CDN сервисах такой пробл...
Andrew Krw.
1
Добрый день. Мне посоветовали обратиться к вам в чат за помощью. Ситуация описана на скрине. Как мне сказали, мне на бота навесили флудвейт. Есть ли возможность снять его ра...
OVERLINK
7
Просто по очереди выпиливаешь на ручной маппинг? По методу за раз
Andrii Kurdiumov
7
)) может, нужно поправить? )) 2. Ребята, нам нужно, чтобы сообщения из Инстаграм приходили в ОДУ. Какое приложение посоветуете?
Alexander Sharoiko MSE / Александр Шаройко
1
Приветствую. А не подскажете какие ограничения есть на использования api метода setMyName ? Несколько раз сменил имя бота и получил бан на 2 месяца на смену имени.
Slick Slack
8
Всем привет! Взялся портировать модули на 18 версию, лезет _logger.log(log_level, 'no translation language detected, skipping translation %s', frame, stack_info=True) А чт...
Max Lit
3
И? Все равно глазами проверять надо каждое поле
Andrii Kurdiumov
4
Карта сайта