AlexZeDim
@AlexZeDim

Архитектура проекта: выбор базы, связи в таблице, noSQL или SQL?

«Как я разрабатывал свой пет-проект или господа, кажется я облажался»
Собственно это не совсем обычный вопрос, а скорее попытка найти совет или нажиться на чужом опыте, потому что своего у меня как-то немного.

«Дано»

Маленький пет-проект, у которого написан и полностью работает back-end, на:
  • Mongo
  • Express
  • JS
  • Node.js

-
Суть проекта.

Сервер периодически парсит по API чужой сервер и раскладывает по коллекциям/таблицам, манипулирует данными и выводит уже у меня на сайте. Всего на проекте 3 коллекции.
  • Предметы (у них есть id-шники и их свойства)
  • Лоты/заявки (и свойства самих заявок, т.е. один из параметров это id предмета, а второй - имя участника)
  • Участники (которым принадлежат заявки, и свойства самих участников)

Поскольку у нас mongo, то понятное дело что ни о каких связях речь не идет. Да и на стадии проектирования, необходимости в связях не планировались.

Use case

Что имеем сейчас, по факту:
Т.е. у нас есть три коллекции, которые между собой связать можно, по принципу (в формате коллекция:имя поля):
  • предметы:id ->заявки:item
  • участники:name->заявки:name

Ключевое слово «можно», но реальный кейс заключается в том, что 99% времени я обхожусь без этого. т.е. мой сайт на странице выводит уже готовую информацию по конкретным предметам. База «сама», следуя своей логике, отбирает интересные для меня предметы, без построения запросов с моей стороны.

Но раз в месяц (условно, т.е. не очень часто). Мне например надо запросить статистику по вполне конкретному предмету. Поскольку люди оперируют названиями, а не id кодам, то допустим что у меня есть input поле куда я должен вписать название предмета и получить Х заявок по нему. Логика кода здесь такая:
items.find({name:name}).then(res.id)
     orders.find ({item:res.id}).then(res=>{
          ....
     }

  1. Т.е. я сперва спрашиваю одну коллекцию, получаю из неё нужное поле, результат по которому я использую для поиска в другой коллекции. Ну да, это работает, индексы расставлены, база оптимизирована, запросы идут не часто и в интерфейсе входная точка для пользователей это не input field и формочки, так что проблем нет. Но вопрос в том, а правильно ли это вообще?
  2. Собственно в mongo тоже можно проставить связи, но как я понял дело даже не в том. что база не предназначена для этого, сколько в том что тогда данные хранятся в виде вложенных документов. Очевидно что если каждая запись в коллекции заявок будет в себе хранить полные сведения по предметам/участникам, то они будут дублироваться Х раз, что мне совсем не надо. Но иногда, мне наоборот, надо что бы результат выводится в формате вложенных документов, как будто я использую JOIN из SQL. Я чего-то не понимаю в mongo и моя проблема все-таки как то решается, или надо действительно переходить на postgres в таком случае?
  3. И третий вопрос. Дело в том, что у меня на проекте выполняется очень много агрегаций. Насколько я слышал, postgres в таком случае будет «шустрее», так ли это?


У меня нет дедлайнов, т.е. для меня не проблема неспешно перейти с mongo на postgres. В моем случае минусы у postgres тоже есть. Это отсутствие TTL (time-to-live) индексов. Конечно есть аналогичный функционал вроде триггеров, при случае записи в базу, но это немного-не-то.

Вообще, вопрос заключается скорее в том, я могу не париться насчет всего этого, это (не)нормальная практика и дальше использовать mongo (ну там поставить связи 1-к-1) и не думать об этом или все-таки в подобных случаях надо действительно использовать что-то более тради.. реляционное, с JOIN-нами и т.д.?

Я буду рад любому ответу, и понимаю что использование mongo сводится «к ошибке новичка» потому что сейчас много туториалов, которые написаны под noSQL.
P.S. Кстати, если кто-то хочет ещё чем-то помочь, или посоветовать мне хостинг, можете написать здесь или в Какой конфиг/хостинг/решение посоветуете под легкий Mongo+Node+React (MERN/MEAN/MEVN stack) проект? :
По поводу размеров базы и т.д. могу написать что у меня ни Aliexpress и не HiLoad проект. БД с 5-10GB, и она отлично работает на таком конфиге на одном из хостингов: 7CPU@2GHz, 7GB RAM, SSD 100'000+ IOPS.
  • Вопрос задан
  • 194 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы