• Как правильно организовать архитектуру MongoDB?

    @nrgian
    Низзя так.
    Вы поступаете как поступали бы с реляционной СУБД типа MySQL и т.п.
    Там связи между таблицами - это норма.

    А Mongo их очень плохо обрабатывает.
    В ней делают денормализацию.

    Тут я присоединяюсь к grinat
    Если уж вы методами предназначенными для реляционных СУБД работаете, то:

    Правильно будет удалить mongo и поставить mysql/posgres


    UPDATED:
    qovalenko,
    Я Вас понимаю, дело в том, что если добавить данные второй коллекции к данным первой, то при обновлении этих данных нужно будет изменять их в нескольких документах первой коллекции, а это не так уже и удобно.


    Это нормально.
    Это следствие денормализации.
    Это такая плата за плюсы Mongo.

    Если хотите пользоваться нормальной формой, без дублей - то вам прямой путь к реляционным СУБД: PostgreSQL/MySQL/MS-SQL/Oracle и т.п.

    Ведь NoSQL не просто так быстры и не просто так хорошо масштабируются.
    Неужели вы думаете, что разработчики реляционных СУБД более 40 лет их создают и не могут добиться таких впечатляющих результатов, как за смешные 10 лет достигли NoSQL?

    В Mongo и прочих NoSQL много чего урезанно по сравнению со строгими СУБД каковыми являются реляционными. И только это и позволяет им работать быстро и масштабироваться просто.

    Но за все нужно платить.

    Ну например, чего только стоит, что данные на серверах Mongo при репликации станут верными "когда-нибудь потом, но когда точно мы не знаем" Согласованные в конечном счете (Eventually Consistent)

    Или же упомянутая вами проблема с тем, что необходимо отслеживать дубли при денормализации.

    Я вам больше скажу - если вы не хотите чтобы производительность вашей системы проседала - то эти дубли вам придется устранять не сразу при изменении, а какой-то отдельной процедурой синхронизации, запускаемой, к примеру, раз в час. А в течении этого часа в одном части вашей Mongo будут одни данные, а в другой части - другие данные.

    То, как вы хотите сделать - с нормализаций - в Mongo делать нельзя из соображений производительности и корректности работы транзакций.


    Ну не предназначена она для этого. Именно это в Mongo и вырезано (точнее изначально не реализовано) по сравнению с реляционными СУБД.

    Только в реляционных СУБД как раз всё можно сделать именно так, как вы и хотите (но там вы заплатите ограничениями при масштабировании).

    Если проект не очень большой (скажем так: размеры данных на несколько терабайтов или меньше, что позволяет использовать 1 сервер для всех данных; и максимальное число серверов при репликации 2-3) - тогда реляционные СУБД будут весьма производительны и смысла в Mongo нет.

    Вот здесь на видео все доходчиво объяснено - где у кого какие преимущества и какие недостатки:
    Postgres vs Mongo / Олег Бартунов

    Если же вам нравится Mongo, потому что она schemaless, то подобное уже есть и в PostgreSQL
    "Умное" индексирование jsonb | Олег Бартунов, Ники...
    Отныне вам необязательно все поля прописывать отдельно в CREATE TABLE (но желательно все же отдельно прописывать, через которые осуществляются связи между таблицами - то есть всяческие ID - чтобы оптимизатор запросов лучше работал)

    Внимание, для этого в PostgreSQL используется тип данных JSONB, не путать с просто JSON

    Если же вы хотите оставаться с Mongo, то делать нужно так, чтобы 1 запрос пользователя в вашем интернет-магазине (или что там у вас) в конечном итоге сводился к 1 запросу на извлечение данных из одной-единственной коллекции Mongo.

    А это значит, что будет нужна денормализация, которая и означает дублирование данных. Что ведет к необходимости синхронизации дублей.

    При этом, если изменение данных интенсивное, то синхронизацию дублей придется делать отложенную (по cron и т.п.), а не сразу в момент записи.

    Это нормально в Mongo. Разработчики Mongo сами так и рекомендуют делать.
    Ответ написан
    3 комментария
  • Как правильно организовать архитектуру MongoDB?

    @grinat
    Правильно будет удалить mongo и поставить mysql/posgres
    Ответ написан
    1 комментарий
  • Как правильно организовать архитектуру MongoDB?

    longclaps
    @longclaps
    Первая коллекция это однотипные документы, каждый из которых содержит: пол, вес, рост, возраст и ссылка на одежду в которую одет.
    Типичная SQL-таблица.

    Вторая коллекция содержит документы на которые ссылаются первые: Тип одежды(футболка, джинсы), ее цвет и кто на нее ссылается.
    Типичная SQL-таблица.
    Ответ написан
    Комментировать
  • Стоит ли реализовывать такой подход и если да, то как скомпилировать?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Возможно, но судя по вопросам вам еще во многом предстоит разобраться. Вряд ли вам кто-то будет тут писать конфиги nginx и вебпака.
    Гуглите react/vue production build.
    и скорее всего еще пригодится роутинг в аппах, history api и как настроить nginx чтобы он по всем роутам которые есть в приложении отдавал нужный js, а при обращении к css/картинкам - отдавал их.
    еще есть codesplitting, чтобы грузились только нужные части приложения но для начала сделайте все одним js файлом, чтобы понять как оно все работает.
    Ответ написан
    2 комментария
  • Стоит ли реализовывать такой подход и если да, то как скомпилировать?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Просто я думаю если выполнить npm старт и скопировать build.js который вернется в index.html и запустить это в том же nginx с переадресацией маршрутов в index.html - то не получится то, что я планирую?

    Вам надо настроить nginx чтобы он отдавал статику(шрифты, картинки, стили и прочее) и по всем не статическим маршрутам отдавал html с приложением.
    Ответ написан
    2 комментария
  • Как реализовать выбор из MongoDB?

    @Urukhayy
    db.collection.find({
      "data.param": {
           $gte: 1999,
           $lte: 2005
       }
    })
    Ответ написан
    1 комментарий
  • Как передать результат запроса в другую функцию?

    @StockholmSyndrome
    const result = await db.collection("collection").findOne({colID: 1});
    const res = await db.collection('collectiontwo').insertOne({title: result.title}); 
    client.close();
    Ответ написан
  • Как сделать, чтобы данные из одной функции передавались только после того, как завершится асинхронный запрос в другой функции?

    @StockholmSyndrome
    function a(data) {
      b().then(() => {
        send(data);
      });
    }

    или
    async function a(data) {
      await b(); 
      send(data);
    }

    при этом функция b должна возвращать Promise
    Ответ написан
    Комментировать
  • PSR-0 или PSR-4, и как правильно построить структуру проекта?

    27cm
    @27cm
    TODO: Написать статус
    Первый вопрос который меня интересует это PSR-0 или PSR-4. На сколько я понял по состоянию на 21 октября 2014 года PSR-0 был помечен как устаревший.

    PSR-4 не замена PSR-0, а дополнением к нему.
    github.com/php-fig/fig-standards/blob/master/accep...


    про PSR-3 я вообще как-то не нашел русскоязычной информации, словно такого стандарта нет

    Видать, не перевели. Читайте в оригинале:
    github.com/php-fig/fig-standards/blob/master/accep...


    /path/to/project/ это путь к проекту и данный путь нигде не фигурирует, это та директория из которой запускается основной index.php

    Да, это пусть к PHP файлам проекта. Но index.php обычно выносят в отдельный каталог (например, /public), а все классы проекта хранятся, например, в /src (или /lib или ещё как угодно). В конфигурации веб-сервера запрещают отправлять запросы к любым файлам, не лежащим в /public, благодаря этому /public/index.php является единственной точкой входа для внешних запросов.


    ./vendor это папка назначение которой я не понимаю

    Это папка для сторонних библиотек, используемых в вашем проекте. Используется composer'ом. Внутрь лезть особо причин нет, composer сам решит как ему там всё разложить. Свои классы вы туда тоже не должны писать.


    в итоге честно говоря я запутался в том как правильно надо строить свои каталоги, какие папки обязательные какие нет, когда использовать src, когда lib, когда tests, почему в некоторых структурах приходится дважды указывать имя поставщика и имя пкета и т.д.

    src и lib - скажем так, синонимы. Кому как больше нравится. Главное, что внутри лежат сами PHP файлы проекта, следующие стандарту PSR-4. Лежат там только файлы, написанные авторами проекта. Поэтому нет смысла класть vendor внутрь src (или lib).
    test - каталог для тестов проекта.
    В папке vendor имя поставщика и имя проекта могут совпадать, вот они и дублируются.

    Так как вы изобретаете свой велосипед, то и структуру каталогов делайте свою, или посмотрите на популярные CMS/фреймворки, но везде будет по-разному. Joomla, WordPress, Yii, Zend Framework, Symfony.

    Я придерживаюсь такой структуры:
    /config                     Глобальные настройки проекта.
    /data                       Временные файлы. Например:
    /data/cache	            Файлы кеша.
    /data/logs	            Логи.
    /data/tmp	            Прочие временные файлы.
    /module                     Модули проекта. Например:
    /module/Backend	        
    /module/Backend/config      Настройки модуля.
    /module/Backend/src	    Файлы PHP модуля. Например:
    /module/Backend/src/Backend/Path/To/ExampleClass.php
    /module/Backend/test	    Unit-тесты модуля.
    /module/Backend/view	    Шаблоны модуля.
    /module/Frontend/...
    /public/index.php
    /public/css
    /public/font
    /public/img
    /public/js
    /vendor


    Возможно, я ошибаюсь, но самая главная ваша беда в том, что вы решили разрабатывать собственную CMS, не поработав с существующими, не выявив достоинства и недостатки их архитектур и структур каталогов.
    Ответ написан
    7 комментариев
  • Как настроить сеть в VirtualBox - виртуальная машина будто удалённый сервер?

    @Mr_Howell Автор вопроса
    Wexter.
    1) Выключил виртуальную машину.
    2) Добавил вторым адаптером "VirtualBox Host-Only Ethernet Adapter"
    12616011b7ec45eab1f313aebbd71908.png241395c9bb354847b04378804b77c5f5.png3) Сменил настройки IP в адаптере хоста на:
    ba57ea264e2d4320bb6d7f34beed2770.png9690bb55e1274732bf3bcc96ffab654d.png4) Включил машину.

    По "sudo ifconfig" изменений нет, в показателях "VirtualBox Host-Only Ethernet Adapter - хоста" также по нулям. Ни ping ни скан портов nmap'ом - по прежнему не видят гостевую машину.

    =======================================================================================
    UPD 1

    Мне достаточно одного сетевого интерфейса VM в принципе
    Пробую с такими настройками включить машину.
    3b907a3193624d20960e5ea10e7fa6f0.png
    но трафик что то не ходит по нему до сих пор.
    =======================================================================================
    UPD 2
    Всем спасибо. С такими настройками трафик прошёл:
    e1be8a550e8345d8b10343efeff9317b.png
    Ответ написан
    3 комментария
  • Как можно создать сервис вроде lingq?

    Ranwise
    @Ranwise
    можете поковырять древний аналог Learning with Texts (LWT)
    Ответ написан
    Комментировать
  • Используете ли вы внутренние балансеры nginx для балансировки запросов между микросервисами?

    @chromimon
    Внешние Ingress, Traefik, HAProxy, nginx

    То, что вы называете внутренними балансерами на это есть уже готовые системы например Kubernetes,
    а есть service discovery например Consul

    В схеме с service discovery балансировкой занимается клиент, получая от service discovery информацию о доступном сервисе.
    Ответ написан
    3 комментария
  • На что заменить express.js?

    standy
    @standy
    koajs.com — фреймворк без колбеков. Работает на фичах es6, таких как генераторы.
    Попробуйте es6 — кофе не нужен.
    Ответ написан
    1 комментарий
  • Как сделать service discovery для клиентских приложений?

    Ni55aN
    @Ni55aN Автор вопроса
    На данный момент нашел для себя более удобный и просто вариант:

    Docker Swarm + Traefik.

    В существующих docker-compose.yml всего-навсего пришлось изменить build на image, прописать команды для предварительного сбора образов и добавить метки для traefik.

    Через Swarm могу развернуть масштабиремые контейнеры на нескольких машинах, на которые (в нужный микросервис) будет перенаправлять Traefik согласно поддомену (метка traefik.frontend.rule=Host:...)
    Ответ написан
    Комментировать
  • Керниган, Ритчи: Упражнение 1.13, Я что-то не так понял?

    Гистограмма длин показывает распределение количества встретившихся слов от их длины, т.е. вам нужно нарисовать n полосок (от 1 до n где n максимальная длина слова), в каждой полоске должно быть количество делений пропорциональное количеству слов данной длины. Т.е. если слов из 6 символов вдвое больше чем слов из 8, то полоска для 6-символьных слов должна быть вдвое длинней.
    Ответ написан
    Комментировать
  • Как использовать обученную модель tensorflow?

    @ivodopyanov
    NLP, python, numpy, tensorflow
    Там же есть файл udc_predict.py с примером использования обученной модели для предсказаний
    Ответ написан
    2 комментария
  • Как реализовать анализ запросов?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    https://machinelearningmastery.com/gentle-introduc...

    для скорости никакой анализ на лету не делается, только сравнение с вектором
    Ответ написан
    Комментировать