Преимущества в производительности при хранении документов в формате JSON в MarkLogic 6

Если бы мне пришлось хранить одну и ту же разметку в двух отдельных документах, один XML, другой JSON, в MarkLogic 6, будет ли MarkLogic автоматически преобразовывать эквивалент JSON в XML и индексировать его в этом отношении, или оба хранятся в своих соответствующих форматах?

Я понимаю, хранит ли MarkLogic ВСЕ документы как XML, независимо от того, и просто ли применяет преобразования JSON к документам JSON при запросе?

Если документы хранятся в собственном формате, есть ли преимущества с точки зрения производительности для хранения документов в JSON над XML?

Ниже приведен пример фрагмента кода:

if($outputFormat="json") then (: result in json format :)       
    let $custom-config :=
        let $config := json:config("custom")
        return (map:put($config, "array-element-names",(xs:QName("lp:lesson_plan"), 
                                                        xs:QName("lp:instructional_segment"),
                                                        xs:QName("lp:strand_type"),                                                             
                                                        xs:QName("lp:resource"),
                                                        xs:QName("lp:level"),
                                                        xs:QName("lp:discipline"),
                                                        xs:QName("lp:language"),
                                                        xs:QName("lp:program"),
                                                        xs:QName("lp:grade"),
                                                        xs:QName("res:strand_type"),
                                                        xs:QName("res:resource"),
                                                        xs:QName("res:ISBN"),
                                                        xs:QName("res:level"),
                                                        xs:QName("res:standard"),
                                                        xs:QName("res:secondaryURL"),
                                                        xs:QName("res:grade"),
                                                        xs:QName("res:keyword"))), 
                map:put($config, "whitespace","ignore"),
                map:put($config, "text-value","value"),
                $config) 
    return json:transform-to-json($finalResult, $custom-config)
else (: finalResult in xml format :)        
    $finalResult

person Paul Mooney    schedule 15.07.2013    source источник


Ответы (4)


На диске MarkLogic хранит сильно сжатые структуры данных C ++, которые представляют иерархические деревья и соответствующие индексы. (Хорошо, это чрезмерное упрощение, но тем не менее иллюстративное.) Есть два места, где вы, как разработчик, обычно будете взаимодействовать с этими структурами данных: 1) создание запросов и логики приложения 2) десериализация / сериализация данных в этот внутренний модель данных. Сегодня MarkLogic использует модель данных XML (XDM) для последнего и, соответственно, XQuery, XPath и XSLT для первого. Мы выбрали этот стек по нескольким причинам: XML хорош для представления как текстовой разметки, так и структур данных, а инструменты для XML являются зрелыми и широко распространенными.

При этом JSON превратился в популярную сериализацию иерархических структур данных - «X» в AJAX. Хотя сегодня у нас нет такой же водонепроницаемой абстракции между JSON и внутренней моделью данных MarkLogic, мы предоставляем набор инструментов, которые позволяют вам эффективно и без потерь конвертировать между JSON и моделью данных XML. Кроме того, наши API-интерфейсы REST и Java позволяют хранить, извлекать и даже запрашивать древовидные структуры, созданные как JSON, не задумываясь об этом этапе преобразования; API обрабатывают это в сантехнике.

Что касается производительности, преобразование между JSON и XDM представлением будет связано с небольшими накладными расходами. Однако я ожидал, что для большинства приложений это будет незначительным. Настоящие преимущества XML заключаются в выразительности XQuery, XPath и XSLT при работе с данными. Сегодня в мире JSON нет широко распространенного эквивалента.

person Justin Makeig    schedule 17.07.2013
comment
Спасибо. Мы столкнулись со значительными накладными расходами при хранении документов в XML и их последующем преобразовании в JSON с помощью XQuery. В некоторых случаях запрос, который занимает около 2 секунд, раздувается до 12 секунд с учетом преобразования. Вскоре я предоставлю образец кода, но пока что есть что-нибудь, что явно замедлит процесс преобразования, что касается структуры данных, размера ответа и т. Д.? - person Paul Mooney; 22.07.2013
comment
Да, разместите здесь код или сообщите о проблеме в нашу службу поддержки. Мне очень интересно понять ваш вариант использования. - person Justin Makeig; 25.07.2013
comment
Привет, Джастин! Я отредактировал свой исходный пост, добавив небольшой фрагмент кода. - person Paul Mooney; 07.08.2013
comment
Наш специалист по XQuery сообщил мне, что на самом деле это еще одна проблема, вызывающая накладные расходы на производительность, не связанные с преобразованием JSON. В любом случае, каково ваше мнение об эффективности предоставленного примера кода? - person Paul Mooney; 07.08.2013

MarkLogic является родным для XML, и ему необходимо преобразовать JSON в XML, чтобы сохранить его в базе данных. Для выполнения преобразований существует высокоуровневая библиотека JSON. Основными функциями являются json:transform-to-json и json:transform-from-json, и при правильной настройке должны обеспечивать преобразование без потерь.

Я думаю, что основное отличие от вашего примера заключается в том, хотите ли вы преобразовать в XML с помощью собственного процесса или использовать инструментарий MarkLogic.

Для получения более подробной информации см. Документацию MarkLogic: http://docs.marklogic.com/guide/app-dev/json

person wst    schedule 15.07.2013

Одно примечание: REST API (и, следовательно, оболочка Java API вокруг REST API) предоставляет фасад для преобразования JSON в XML, то есть API выполняет преобразование в XML за вас.

Обычно вам не нужно думать о преобразовании, за исключением случаев, когда вы создаете диапазоны и геопространственные индексы для преобразованных элементов.

Если вам нужно поддерживать документы JSON в вашем клиенте, то фасад удобен.

С другой стороны, представление структуры в виде JSON не имеет преимуществ для операций с базой данных и некоторых ограничений. (Например, XML имеет основанные на стандартах запеченные атомарные типы данных, проверку схемы и серверную обработку с помощью XQuery или XSLT.) Итак, если у вас есть полный контроль над структурой данных, вы можете захотеть записать ее на сервер как XML.

person ehennum    schedule 15.07.2013

Начиная с MarkLogic 8 (февраль 2015 г.), JSON теперь является собственным типом данных, как и XML. Это устраняет необходимость в слое перевода для приложений, которые хотят работать исключительно в JSON. Кроме того, мы добавили JavaScript в качестве первоклассного языка в самой базе данных (с использованием Google Двигатель V8). Это означает, что вы можете писать хранимые процедуры, триггеры и даже полные HTTP-приложения с помощью JavaScript, который выполняется в базе данных, рядом с данными.

person Justin Makeig    schedule 08.09.2015
comment
В чем преимущества / недостатки хранения данных в формате json по сравнению с форматом xml? Я считаю, что база данных xml будет лучше, чем json? Или оба будут одинаково выполнять одну и ту же работу? Если да, то json будет лучше, так как меньше места для хранения и, следовательно, улучшится производительность. - person stuckedoverflow; 10.05.2016
comment
MarkLogic управляет JSON и XML внутри как высоко оптимизированными деревьями. Таким образом, < и { актуальны только для синтаксического анализа и сериализации. При выборе между JSON и XML вы должны подумать о том, как будут использоваться ваши данные и какие инструменты / навыки будут использовать ваши разработчики. Различия в хранении / производительности незначительны по сравнению с ними. - person Justin Makeig; 13.05.2016