
Alex
11.07.2017
05:44:12
и что на этом кейсе монга реально будет быстрее чем РСУБД ? вроде все банально

Viktor
11.07.2017
05:45:48
товарищи, я понимаю, что проще сказать "перепиши на %технология нэйм%", но давайте предметно обсудим можно ли здесь что-то еще улучшить или нет

Aleksandr
11.07.2017
05:46:39
в связи с тем, что монга может терять данные и это было учтено в проектировании, мы просто стёрли монгу и поставили постгрес

Google

Aleksandr
11.07.2017
05:46:39
и данные?
Сделали вид, что монга их утеряла )
шикарный кейс переезда )

Alex
11.07.2017
05:47:02
огонь да )

Aleksandr
11.07.2017
05:47:21

Sergey
11.07.2017
05:50:06
Есть коллекция, типа история стейтов, основная операция чтения - сгруппировать по признаку и взять последнее по дате. Я делаю поиск, потом сортировку по дате в обратном направлении, потом группирую по признаку и беру первое, что попадется в каждом, навесил на это индекс, проверил, что он используется для данного запроса. Сейчас покажу как выглядит запрос
Что бы ускорить запросы:
1. ограничить варианты выборки по признакам до 20 -30 штук
2. заранее группировать по ним на стадии записи данных (а не на стадии выборки), т.е. иметь и поддерживать готовые группы которые моментально отдаются по запросу
вот решение в стиле nosql
насчёт переезжать на sql не факт что там будет в целом удобнее и быстрее, там возникнут свои проблемы

Viktor
11.07.2017
05:56:06

Sergey
11.07.2017
06:02:24


Viktor
11.07.2017
06:04:01
ммм, спасибо
а если
добавить коллекцию, где будет по одному (последнему) стейту для каждого признака
и продолжать также писать во вторую последовательно
тогда у меня будет полная и история и быстрая выборка, но добавится записей

Google

Viktor
11.07.2017
06:05:43
это рабочий nosql-like подход?

Sergey
11.07.2017
06:05:58
избыточность - это норма для nosql решений
Идея проста : если тормозит во время выборки - расчитай заранее и отдавай готовое

Viktor
11.07.2017
06:08:11
единственное, что парит в третьем варианте это удвоенное кол-во записей
точнее вместо insert будет insert в одну+ update во вторую
но здесь я так понимаю уже нагрузочные тесты покажут что эффективней

Sergey
11.07.2017
06:09:16
сейчас терабайтные дисковые массивы, а у тебя анкета 48кб )
я бы ещё это расчитанное - в пямяти бы хранил !

Viktor
11.07.2017
06:10:48
да, я бы тоже, но у меня несколько серверов (одни пишут, другие читают)
если только в редис класть
рассчитанное
в принципе тоже идея

Sergey
11.07.2017
06:12:57
что за проект, он в продакшене ?

Viktor
11.07.2017
06:13:30
образовательная система
в продакшене, уже года два
и заказчик обозначил перформанс как требование
плюс сокращение расходов на железо

Sergey
11.07.2017
06:15:40
А сколько сейчас серверов ?

Viktor
11.07.2017
06:16:11
три веб-сервера в лоад балансере, два почти всегда выключено
и 5-6 процессинг-серверов

Google

Viktor
11.07.2017
06:16:34
где-то 4 работает обычно
там elastic load balancing у aws

Sergey
11.07.2017
06:16:54
на чём написаны ?

Viktor
11.07.2017
06:17:07
.net
на основных сценариях один веб-сервер примерно вытягивает до 300запросов\сек, может больше, наверное
не супер хайлоад, конечно

Sergey
11.07.2017
06:20:29
а где эта система сейчас используется ?

Viktor
11.07.2017
06:21:03
страны т.е. какие?
я наверное не могу по нда сказать где именно)

Sergey
11.07.2017
06:22:01
по nda нельзя про структуры данных рассказывать )

Viktor
11.07.2017
06:22:36
да я толком ничего и не раскрыл
id, eventid, categoryid мало о чем говорит

Aleksandr
11.07.2017
07:33:04
народ, а кто-то замерял скорость поиска при использовании лукапа и последовательного поиска (то есть сперва готовишь список айдишников из внешней коллекции, а потом полученный массив подставляешь в фильтр фильтруемой коллекции) ?

yopp
11.07.2017
07:41:58
зато быстро
И ты тоже. Что быстрее и где бенчмарки, с анализом вводных и результатов?
Короч, я всех участников дискуссии выше предупреждаю, особенно @CapDev и @dezconnect: прекратите с умным видом давать советы про sql/nosql. Вы оба не пытаетесь разобраться в чужой проблеме и предложить решение с документным подходом и начинаете советовать какую-то тухлую пежню.
Бездумно топить за SQL и предлагать переписать существующий проект на пг за неделю идите в другом месте. Здесь мы помогаем решить проблемы с дизайном для документной субд. Если вы ее не осилили, сначала осильте, потом давайте советы.
Это было последнее предупреждение, дальше на неделю в r/o.

Sergey
11.07.2017
08:29:33
1

Serhio
11.07.2017
08:32:46

Tenni
11.07.2017
08:54:09
чат по монге, предлагают переехать на sql
прикольно =)

Google


yopp
11.07.2017
08:55:39
Ты нас покидаешь за хамство.
По озвученному вопросу. В дизайне данных есть два полюса: высокая нормализация (данные хранятся один раз в одном месте, все остальное ссылается на хранимые данные) и высокая денормализация (данные хранятся много раз, в нужных местах).
Но нужно понимать что это не строго одно или другое, это шкала от одного до другого.
Реляционные субд в целом эффективнее для работы с нормализованными данными, тогда как документные субд эффективнее для работы с денормализованными данными. На практике многие субд реализуют работу с информацией в двух формах с разной степенью эффективности.
Выбирать решение нужно исходя из того как будет использоваться информация. Если информация часто обновляется и нужно всегда иметь актуальное на текущий момент состояние связанных сущностей — без ссылок не обойтись. Если информация не изменяется, то можно обойтись вложенными документами. Если нужна только часть информации, то лучше разделить её на несколько документов.
В контексте монги, нужно понимать что классические паттерны из sql тут не работают. Если нужно many to many для динамических данных, то эффективнее нормализовать отношения, но не создавать связующий объект, а хранить указатели в массиве, в каждой из сторон ассоциации. Если данные immutable но их много и все они не нужны при запросе документа, их можно денормализировать, разделить на группы и хранить в отдельных документах.
Для того чтоб выбрать решение, нужно понимать какие проблемы необходимо решить прямо сейчас, а не в будущем. Если проблема не понятна — выбирать решение которое проще реализуется и накапливать опыт, который уже использовать для улучшения схемы. Сделать идеальную схему невозможно. Лучше вложить силы в инструменты которые позволят безболезненно менять схему, чем тратить силы и энергию на попытку угадать проблему.


Евгений
11.07.2017
09:31:49
Дельно. Спасибо.

Dmitry
11.07.2017
11:34:00
ребят захожу с вопросом снова
как бы мне хранить вот такое в монге, но потом вытащить списком дерево папки-файлы?
ну или вытащить могу две коллекции, а на беке их объединить
если кто подскажет как построить потом дерево из этого - буду признателен

Aleksandr
11.07.2017
12:27:33
лучше вытащить две коллекции и на беке объединить
монга начинает провисать при поиске в связанных коллекциях
я бы сперва сделал запрос с сортировкой по ParentDirID (там где она null - это получится родительская директория)
и в бэке перебирал массив

Dmitry
11.07.2017
12:50:18
придется подумать как дерево постоить из этих двух коллекций

Aleksandr
11.07.2017
12:51:00
многомерный ассоциативный массив.
где ключ - айди категории
думаю сперва стоит собрать дерево категорий
а потом распихивать по нему "файлы"

Dmitry
11.07.2017
12:53:58
да

Aleksandr
11.07.2017
12:55:01
собери потом массив файлов вида {dir_id: {file_id: id, name: name}}
и потом этот массив файлов проще будет вставлять в содержимое дерева папок

Google

yopp
11.07.2017
13:24:35
Это общепринятый паттерн для иерархических данных. В монге не обязательно использовать строку с разделителями сегментов, можно использовать массив
Т.е. твоя проблема всё ещё в разделении папок и файлов на две разные сущности. Если ты объеденишь их в одну, то даже без materialized path тебе станет сильно проще вытаскивать куски дерева
Но задача поставлена слишком абстрактно: «вытащить дерево списком» можно разными способами. Если нужна сортировка по иерархии, то это одна история. Если просто нужно вытащить в случайном порядке — другая.

Dmitry
11.07.2017
13:39:42
Мне нужно вытащить либо все, либо указав какую-то папку, и вытащить все что в ней есть (дерево)