o7412369815963
эквивалентно “я не знаю”
Возможно я где-то случайно обронил “пишу книгу МонгоДБ для профессионалов”?
o7412369815963
> Возможно я чего-то не знаю, но из чего следует такое утверждение?
- вопрос против явного
Мне конечно приятно сознавать, что кому-то что-то “явно”, но странно, что своим пониманием явности, он не желает делиться, но для чего-то участвует в дискуссии отвечая общими фразами а-ля “ну это же очевидно”.
o7412369815963
попытка вытянуть факт в другую плоскость (подмена фактов, цифр о которых не разговаривали), “если бы, то кабы…”
Мы разговаривали в первую очередь не о цифрах, а об архитектуре. В одном наборе тестовых данных Вы находите превосходство подхода, на другом наборе вдруг возражаете: “мы так не договаривались”.
Мы рассматривали случай базы имеющей свойство расти и интересно поведение архитектуры не только через пять минут, но и через год, когда что-то поменять будет сложно, поэтому такие вещи нужно продумывать заранее. Не понимаю откуда в техническом обсуждении берётся эмоциональность? Ок, появились новые цифры, давайте рассматривать это как новый вопрос, раз старый исчерпан.
o7412369815963
Сначала попробуйте сделать опровержение “философскому”: ограничение - есть не удобство.
Вообще-то с этого “философского” начался весь топик.
o7412369815963
вы задаете короткий вопрос по монге - мы отвечаем
Полагаю, если я вижу в сообщениях других участников публичной дискуссии неточности, недосказанности и прочие искажения, я всё же имею право отметить это, не так ли?
Lexander
pg-json умеет делать меньше 10 операций.
Причем все операции сводятся к преобразованию в строку.
У Монго есть язык запросов.
Остальные операции умеет делать сам постгрес (на всякий случай, о каких операциях мы говорим?)
По поводу ограниченности конкретно этого расширения - как выясняется автор вообще создал его ради развлечения, так что, может быть это и не совсем удачный пример. В постгресе есть и более мощные расширения реализующие дерево через XML, но речь шла про json, поэтому выбор примера пал на это расширение.
Тем не менее возможностей поиска это не отменяет, как минимум сравнение в нём производится не по строке. Сами же данные хранятся в двоичном виде. В postgres также есть механизм вычисляемых индексов, что близко по смыслу к map.
Разработчик приводит такой оразец запроса:
select
id,
(data -> ‘first_name’)::text as “First Name”,
(data -> ‘last_name’)::text as “Last Name”,
(data -> ‘email.work’)::text as “Work Email”,
(data -> ‘email.personal’)::text as “Personal Email”
from users;
Полагаю, когда реализована эта функциональность, ничто не мешает оператору -> появиться в where секции (преобразование типа здесь использовано, поскольку фрагмент джейсона также является джейсоном в текущей реализации расширения).
Lexander
Впрочем специфика (ограничения) union как раз и показывает ее реляционную сущность. Например, соблюдение порядка следования, кол-ва и типов полей в запросе.
Собственно, у меня даже мыслей не было, что речь может идти о union, если в постановке задачи фигурировали РАЗНЫЕ ПО СТРУКТУРЕ коллекции (таблицы).
В данном случае о структуре говорить вообще сложно, поскольку между соседними документами коллекции может не оказаться вообще никакого сходства. Если обобщать, то мы можем сравнить коллекцию монго с одноколоночной таблицей реляционной базы, колонка которой имеет тип json (это условное сравнение, поскольку реляционный подход такого не допускает и имеющиеся решения - гибрид с нереляционными). В таком описании слияние двух коллекций есть ничто иное как union.
Точно так же и выборка ведётся не по структуре, а по соответствию паттерну структуры. Именно поэтому мне здесь сложно увидеть классическую реляционность, но, возможно, я не учитываю не очевидных мне нюансов?
Lexander
Тело документа, действительно, зачастую - таблица. И хранить ее естественно в табличном виде.
Тем не менее, мы имеем ОДНУ сущность, которую вынуждены разбить на несколько и поместить в разные таблицы.
Это лишь часть картины.
С одной стороны, шапка документа - тоже таблица для набора документов. Роль таблиц здесь - в задании правил обработки этих документов. Правила требуют определённых данных на входе и мы никуда от этого не денемся. Сохраняя документы в бессхемной БД, мы всё равно будем вынуждены следовать регламенту, хотя возможности по сохранению информации о документе оказываются шире. Несомненным достоинством бессхемной базы является именно более гибкая возможность расширения регламента. Но данные по прежнему должны соответствовать ожиданиям приложения.
Теперь другая сторона - данные документа являются составляющей не одной сущности, а нескольких, документ - лишь одна из них. Работая с документами нам кажется естественным сгруппировать эти данные в одном месте. Работая с движением товаров и финансов, это уже не кажется столь естественным. Дерево - это вообще очень не универсальная структура. Значительно универсальнее фасетная классификация.
Например в документе мы хотим видеть контрагентов и список товаров. У контрагента мы хотим видеть список документов и список товаров. У каждого из складов мы хотим видеть список документов и список товаров. Что чему здесь должно быть корнем иерархии? Строгая иерархия здесь неприменима. Поэтому мы и приходим к понятию множества записей, в котором документ - это один способ объединить элементы множества в сущность, движение конкретного склада - другой способ, движение контрагента - третий. То же самое не с товарами, а работами и услугами - здесь ещё сложнее картина - добавляется объединение по цехам, бригадам и отдельным исполнителям работ. Отдельная разговор: время как сущность, которой соответствуют наборы фактов и связанных с ними сущностей.
Фасетная классификация - это именно та задача, для решения которой идеально подходят таблицы.
Про аналоги же этой классификации в монго (как решаются подобные задачи за неимением таблиц) - я и спрашивал несколькими постами выше в примере про социальную сеть. Вот у нас пользователь “тысячник”, у которого число друзей перевалило уже не за одну тысячу (или сообщество соответствующего размера - я сам в фейсбуке состоял в одном сообществе, насчитывающем более миллиона человек). Он решает посмотреть, что там у его друзей творится или что нового члены сообщества пишут. Что мы делаем? По описанной выше схеме берём список его друзей, перегоняем его из базы в память приложения, напрягая сеть и память приложения. Делаем запрос, в котором список этих друзей перегоняем обратно в базу и получаем в ответ пару десятков сообщений. Но гонять эти данные туда-сюда - это явный оверхед, почему просто не сказать базе - “возьми этот набор оттуда-то”, если этот набор всё равно придётся брать? (2
o7412369815963) Поэтому вопрос “как сделать эффективно?” всё ещё актуален.
Монго - изначально позиционируется как СУБД для “больших данных”, поэтому приём пустой перегонки данных мне тем более не кажется эффективным, хотя и есть частные случаи, где таких оверхедов не возникнет, но они очень узкие и смена потребностей клиента потенциально готова убить идиллию на корню.
Сорри, половина этого ответа получилась уже не совсем в ответ на Ваше сообщение, а скорее в рамках дискуссии в целом.
Lexander
Сервер приложений может отсутствовать. Давайте не будем нагромождать частные случаи.
Впрочем, сервер приложений - это тоже еще одно место, где меняется код. Причем этот частный случай вносит еще больше проблем, т.к. при обновлении нужно будет этот самый сервер приложений остановить. Т.е. ваша система не будет работать Н-ное кол-во времени.
Да, сервер приложений может отсутствовать, его функционал может быть вынесен прямо в базу или наоборот в клиент (хотя, имхо, трёхзвенка - куда более общий случай). Модификация этого фрагмента системы в любом случае потребуется, хотя скорее всего она будет и меньше. Для приложений не требующих строгого контроля над структурой данных - этот контроль действительно будет оверхедом, особенно если модификация структуры будет блокирующей. Точно так же, там где он нужен, но отсутствует - ошибки клиента или сервера приложений - породят оверхед по их выявлению и устранению. Что ресурсно дороже - это фактор выбора архитектуры.
Lexander
Уже после первой сотни таблиц (вне зависимости от рода БД) проще смотреть спецификацию, где помимо структуры таблицы (для РБД) описаны все ограничения и преобразования каждого поля. В РБД поле у вас описано в одном месте, ограничения на него - в другом, триггеры на разные события и возможные преобразования значений - в третьем.
Раньше структуру РБД (и остальные плюшки) хоть можно было использовать для контроля правильности данных.
Нынче проверка данных проводится на на всех участках цепи: от клиента до СУБД.
Требования в ПО другие.
Для больших систем человекочитаемая документация незаменима, но всё же ожидания базы при наличии схемы - описаны языком этой базы и их можно прочитать до документации. В документации - уже смысл этих ограничений.
Контроль же на других уровнях диктуется не этим.
Сервер приложений - разгружает уровень базы, которая является бутылочным горлышком (а благодаря меньшей связности своих проверок дешевле масштабируем) и контролирует клиенты, которых может быть много различных реализаций и версий.
Клиент своими проверками - разгружает уровень сервера приложений и сеть, но клиенту доверять нельзя принципиально, поэтому все его проверки носят лишь рекомендательный характер и удалённая сторона при желании может их обойти.
Lexander
И тем самым потребует больших ресурсов. Дорого.
Не совсем понятно. Монго - содержит нефиксированную структуру данных условно неограниченную (технические ограничения есть, но мы до них же не доходим в обоих случаях?). Это разве дорого?
Lexander
Зато напрочь лишают возможности использовать встроенные возможности СУБД.
Начиная с индексов, и заканчивая функциями.
Если брать сериализацию на уровне клиента и двоичные данные, то да, есть только возможность сохранения произвольной структуры (с некоторыми оговорками про поиск подстроки или соответствия регулярке), если это сохранение, решаемое соответствующими типами данных, то нет, даже наоборот, появляются дополнительные возможности индексации множеств и поиска по такому индексу в виде соответствующих операций с множествами.
Lexander
update table set field=NULL
и
alter table drop field
все же разные операции wink
Разумеется, поскольку одна операция - исключение из обязательности участия в запросах соответствующего столбца (причём я имел в виду ALTER COLUMN … DROP NOT NULL с фоновой очисткой “лишних” значений), после чего клиент может работать с этой базой с незначительным оверхедом по занимаемому дисковому пространству, что на фоне других оверхедов достаточно незначительно, если только мы не обнуляем две трети столбцов. Второй же вариант - это обязательный оверхед на простое при переструктурировании хранилища. По этой и другим причинам я склонен к предпочтению первого варианта (а ведь никто не догадался, почему-то выбросить значение всем показалось сложной задачей) - когда-нибудь может понадобиться и добавить столбец, а без соответствующего резерва оверхед второго сценария неизбежен и это именно то место, где бессхемные и гибридные решения бесспорно выигрывают.