Справочные данные NoSql
Отказ от ответственности: по ссылочным данным я не имею в виду ссылочную целостность
Я изучаю nosql и хочу понять, как должны моделироваться данные. Например, в типичной реляционной базе данных для приложения CMS у вас могут быть две таблицы: статья и автор, где статья содержит ссылку на автора.
В системе nosql вы можете создать документ статьи таким образом, поскольку это просто замаскированный графический объект
{
title: "Learn nosql in 5 minutes",
slug: "nosql_is_easy",
author: {firstName: "Smarty"
lastName: "Pants"
}
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {firstName: "Smarty"
lastName: "Pants"
}
и т.д.
Скажите, что однажды мистер Смарти Пэнс решил изменить свое имя на Регулярного Джо, потому что nosql стал вездесущим. В случае такого использования каждая статья должна быть отсканирована и обновлено имя автора.
Итак, мои вопросы: каким образом данные должны быть смоделированы в nosql для соответствия основным примерам использования для CMS, чтобы производительность была на уровне или быстрее, чем RDBMS? mongodb, например, претендует на CMS в качестве прецедента...
Edit
Мало кто уже предлагает нормализовать данные вроде:
article
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {id: "10000001"}
}
author
{
name: "Big Brother",
id: "10000001"
}
Однако, поскольку nosql, по дизайну, не имеет объединений, вам придется использовать функции, подобные mapreduce, для объединения данных. Если это ваше предложение, прокомментируйте выполнение такой операции.
Изменить 2:
Если вы считаете, что nosql не подходит для любых данных, требующих ссылочных данных, пожалуйста, также объясните, почему. Это, по-видимому, делает использование для nosql весьма ограниченным, поскольку любое разумное приложение будет содержать реляционные данные.
Изменить 3:
Nosql не означает нереляционные
Ответы
Ответ 1
Я полагаю, что CouchDB - это база данных NoSQL, если вы так говорите.
Но на самом деле у нас есть языки программирования общего назначения и языки, специфичные для домена. Аналогично, CouchDB - это база данных, специфичная для домена.
Я использую CouchDB много, но мне действительно все равно, использует ли он SQL или NoSQL. CouchDB ценен для меня, потому что API - это 100% HTTP, JSON и Javascript. Вы можете создавать веб-приложения с помощью браузера, выбирающего HTML из CouchDB, а затем запрашивая данные по AJAX. Сказать, что это "не SQL" - это преуменьшение!
В любом случае, вернемся к Smarty Pants и Regular Joe. Возможно, у него есть 100 000 документов. Что делать, если мы просто обновим их все, трудный путь? Ну, это довольно небольшое количество Javascript.
$.getJSON('/db/_design/cms/_view/by_user?key=Smarty+Pants', {
success: function(result) {
// Change the name right here, in the result objects.
var docs = result.rows.map(function(row) {
row.value.firstName = "Regular";
row.value.lastName = "Joe";
return row.value;
})
// Store it!
$.post('/db/_bulk_docs', {"docs":docs}, function() {
console.log("Done! Renamed Smarty Pants in " + docs.length + " documents!");
})
}
})
Да, этот метод даст вам F в классе компьютерных наук. Однако мне это нравится. Я бы написал этот код в Firebug. В моем браузере. Переименование не является атомарным и не имеет ссылочной целостности. С другой стороны, это, вероятно, завершится через пару секунд, и никто не будет заботиться.
Вы могли бы сказать, что CouchDB терпит неудачу в ключевых словах и тестах, но в них участвуют школы с жесткими ударами.
P.S. Представление by_user
построено из map-reduce. В CouchDB map-reduce является инкрементным, что означает, что он выполняет, как и большинство индексов SQL. Все запросы заканчиваются коротким, прогнозируемым (логарифмическим) временем.
Ответ 2
Ваши данные явно реляционные: в статье есть автор. Вы можете моделировать свои данные в магазине NOSQL, таком как MongoDB, точно так же, как и в реляционном магазине. НО, потому что в базе данных нет объединений, вам нужно сделать два вызова в базе данных, чтобы вы ничего не получили.
НО... то, что вы можете сделать с магазином NOSQL, - это денормализация данных для повышения производительности (однократное путешествие, чтобы получить все, что вам нужно для показа статьи), но за счет непосредственной согласованности: всегда точные имена авторов для окончательно точных имен авторов.
Вы можете, например, использовать это в своей статье:
author: {firstName: "Smarty", lastName: "Pants", _id:DE342624EF }
Теперь вы можете быстро отобразить статью, и когда кто-то изменит свое имя, вы можете либо запустить фоновую задачу, чтобы обновить все существующие статьи, либо подождать периодической развертки согласованности, чтобы исправить ее.
Многие основные веб-сайты больше не дают вам немедленной согласованности. Есть изменения, которые вы делаете, которые в конечном итоге будут видны другими пользователями на сайте.
Ответ 3
Позвольте мне заявить, что я не специалист по NoSQL любыми способами. Вместо этого мои знания об этом в основном теоретические.
Тем не менее, я твердо убежден в том, что внедрение системы типа CMS, подобной этой в NoSQL, вероятно, не самый лучший способ заниматься вещами, поскольку данные в основном реляционные.
Мое решение этой проблемы основано на предположении, что используемая вами система NoSQL позволяет загружать записи посредством структуры типа "первичный ключ". Я думаю, что большинство из них, но я уверен, что есть некоторые, которые этого не делают.
Тем не менее, я предлагаю хранить данные следующим образом.
Для автора:
{
_KEY: $AUTHOR_GUID,
firstName: "Smarty",
lastName: "Pants",
}
И для самой записи:
{
title: "Learn nosql in 5 minutes",
slug: "nosql_is_easy",
author: $AUTHOR_GUID,
}
Обратите внимание, что в приведенном выше примере я использую _KEY, чтобы представить, что это значение типа "первичный ключ".
После загрузки сообщения вы можете загрузить автора с помощью этого GUID.
Ответ 4
для конкретного случая, используйте Flyweight, сохраните идентификатор объекта вместо объекта объекта.
article
{
title: "Death to RDBMS",
slug: "rdbms_sucks",
author: {id: "10000001"}
}
author
{
name: "Big Brother",
id: "10000001"
}
для общего предложения схемы схемы mongodb, прочитайте официальные документы
Ответ 5
Эта запись была здесь в течение некоторого времени, но я подумал, что я бы указал на другой метод обработки ссылок "join" и cross-document с CouchDB. Это метод, который я использую в CMS, который я пишу для использования CouchDB (ранее он был написан для MySQL).
CMS называется BlueInk и может быть найден на Github в http://github.com/BigBlueHat/BlueInk В настоящее время переписывание ориентировано на дизайн документа и "рендеринг двигатель", так что нет UI, о котором можно говорить - вы должны обрабатывать все JSON вручную. Это то, что я надеюсь исправить в ближайшее время, но там уже достаточно в репо (после установки в CouchDB), чтобы дать вам представление о том, как "присоединяется".
В BlueInk страница ссылается на элементы контента, которые сами могут быть включены в одну или несколько страниц (или одну и ту же страницу несколько раз). Страница ссылается на элементы страницы через их идентификатор (как в вашем втором примере JSON). При запуске через "page_and_items" вид он будет генерировать вывод, который может использоваться с параметром запроса CouchDB ?include_docs=true
, чтобы вытащить полное содержимое ссылки на элементы содержимого в документе страницы.
Затем вывод результатов передается через функцию _list
и отформатируется с помощью шаблона Mustache и выводится как HTML-страница - все в одном запросе GET.
Эта же схема использования ссылочных идентификаторов с ?include_docs=true
может использоваться в вашем примере использования выше. Использование функции _list
полностью "косметическое", но может быть полезно для реструктуризации выходного представления JSON или его шаблонирования и вывода HTML, CSV, XML и т.д.
Ответ 6
Вы можете точно моделировать свои данные с помощью playOrm И присоединяться в магазине noSQL. playOrm имеет S-SQL (масштабируемый SQL), который является поворотным в SQL, поскольку вы указываете, какие разделы вы запрашиваете. Таким образом, вы можете перейти от СУБД к noSQL и все еще иметь те же привычные инструменты, которые были использованы.