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

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

У каждой книги есть жанр.
Задача: нужно получить все книги по жанру. Чтобы это сделать нужно с клиента отправлять 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 ответов

8 просмотров

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
привет, а расскажите как бэкапите свой vault raft cluster CE? я немного почитал и понял, что нужно как-то выполнять vault operator raft snapshot save backup.snapshot подсовыва...
[DBST] Dmitry Knyazev
5
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Добрый день, не подскажите, если в OC-V3 поменять страндартную директорию /storage/ на /storage2/ - не будет сильно много проблем ?
Max Dubovsky
32
Всем привет! Напишите пожалуйста, кто мог бы оффлайн преподавать некоторые курсы по Odoo в Алматы в одном из ВУЗов? Мы сейчас вместе с Odoo запускаем университетскую программу...
Adil Dauletkhan
2
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
Каким то образом можно определить ширину экрана пользователя перед загрузкой partial-а? Надо рассчитать ширину кадров слайдера для ресайза картинок для container-fluid.
Point 111
22
Добрый день, подскажите как правильно сделать filter в backend-e. Есть модель (товар) у который связь belongsToMany (компания), компаний > 4k, поэтому выборку типа ->all(); н...
Max Dubovsky
7
А как заставить поиск искать? Есть такая формочка <select class="form-control custom-select" name="brand_id" data-handler="onGetBrands"></select>
Денис Александрович
5
Карта сайта