@MongoDBRussian

Страница 107 из 342
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
огонь да )

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

Sergey
11.07.2017
06:02:24
по пункту два: т.е. мне сделать, условно говоря, документ-аггрегат, где будет в качестве айди признак и вложенный массив со значениями? а вставлять не insert в коллекцию, а update({}, {$push}) в документ?
да, то что ты собираешься моментально отдать - должно уже быть в готовом виде всвязи с этим видимо прийдётся ограничить разнообразие поисков. и расчитать варианты заранее —--------- другое решение, менее напряжное, но которое ты видимо уже используешь это кеширование. Т.е. первый запрос медленно посчитали и положили в кеш, второй такой запрос отдаётся быстро из кеша. из минусов - первый запрос тормозит - данные в кеше стали не актуальными (добавились ещё анкеты)) —--- какой вариант оптимизации применять - зависит от структуры данных и структуры запросов

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

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, ты бы уже неделю назад решил свою проблему

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

Т.е. твоя проблема всё ещё в разделении папок и файлов на две разные сущности. Если ты объеденишь их в одну, то даже без materialized path тебе станет сильно проще вытаскивать куски дерева

Но задача поставлена слишком абстрактно: «вытащить дерево списком» можно разными способами. Если нужна сортировка по иерархии, то это одна история. Если просто нужно вытащить в случайном порядке — другая.

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

Страница 107 из 342