Как перестать думать "реляционно" - PullRequest
20 голосов
/ 25 июня 2009

На работе мы недавно начали проект с использованием CouchDB (документно-ориентированная база данных). Мне было трудно отучить все мои знания в области реляционных БД.

Мне было интересно, как некоторые из вас преодолели это препятствие? Как вы перестали мыслить реляционно и начали мыслить документально (извиняюсь за придуманное слово).

Есть предложения? Полезные советы?

Редактировать : Если это имеет какое-либо значение, мы используем Ruby & CouchPotato для подключения к базе данных.

Редактировать 2 : ТАК мне было трудно принять ответ. Я выбрал тот, который помог мне учиться больше всего, я думаю. Тем не менее, я полагаю, что нет реального «правильного» ответа.

Ответы [ 6 ]

12 голосов
/ 25 июня 2009

Я думаю, что после просмотра нескольких страниц на эту тему все зависит от типов данных, с которыми вы имеете дело.

СУБД представляют собой нисходящий подход, при котором вы, разработчик базы данных, утверждаете структуру всех данных, которые будут существовать в базе данных. Вы определяете, что у Лица есть Имя, Фамилия, Отчество и Домашний Адрес и т. Д. Вы можете принудительно применить это, используя СУБД. Если у вас нет столбца для HomePlanet Персона, то вам повезло, что вам нужно быть Person, у которого HomePlanet отличается от Earth; вам придется добавить столбец позднее, иначе данные не могут быть сохранены в РСУБД. Большинство программистов в любом случае делают подобные предположения в своих приложениях, так что это не глупая вещь, которую можно принять и применить. Определение вещей может быть хорошим. Но если вам потребуется регистрировать дополнительные атрибуты в будущем, вам придется добавить их. Реляционная модель предполагает, что ваши атрибуты данных не сильно изменятся.

Базы данных «облачного» типа, использующие что-то вроде MapReduce, в вашем случае CouchDB, не делают вышеизложенное предположение, а вместо этого смотрят на данные снизу вверх. Данные вводятся в документы, которые могут иметь любое количество различных атрибутов. Предполагается, что ваши данные по определению различаются по типам атрибутов, которые могут иметь. Он говорит: «Я просто знаю, что у меня есть этот документ в базе данных Person, который имеет атрибут HomePlanet« Eternium »и FirstName« Lord Nibbler », но не« LastName ».» Эта модель подходит для веб-страниц: все веб-страницы являются документом, но фактическое содержание / теги / ключи документа настолько сильно различаются, что вы не можете вписать их в жесткую структуру, из-за которой СУБД широко распространяет свои знания. Вот почему Google думает, что модель MapReduce roxors soxors, потому что набор данных Google настолько разнообразен, что его необходимо встроить для неоднозначности с самого начала, и из-за массивных наборов данных можно использовать параллельную обработку (которую MapReduce делает тривиальной) , Модель базы данных документов предполагает, что атрибуты ваших данных могут / будут сильно изменяться или будут очень разнообразными с "пробелами" и множеством малонаселенных столбцов, которые можно было бы найти, если данные были сохранены в реляционной базе данных. Хотя вы могли бы использовать СУБД для хранения таких данных, это было бы ужасно быстро.

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


Хорошая статья, с которой я столкнулся и которая довольно хорошо сравнивает и сравнивает две базы данных: MapReduce: важный шаг назад , в которой утверждается, что базы данных парадигмы MapReduce являются технологическим шагом назад и уступают СУРБД. Я должен не согласиться с тезисом автора и утверждать, что разработчик базы данных просто должен выбрать правильный вариант для своей ситуации.

9 голосов
/ 25 июня 2009

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

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

Нереляционные / подобные документу данные имеют смысл при денормализации. Это не сильно изменится, или вы не так сильно заботитесь о последовательности.

Если ваш вариант использования хорошо подходит для реляционной модели, то, вероятно, не стоит втискивать его в модель документа.

Вот хорошая статья о нереляционных базах данных .

Еще один способ думать об этом: документ - это строка. Все в документе находится в этой строке, и это специфично для этого документа. Строки легко разбиваются, поэтому масштабирование проще.

5 голосов
/ 25 июня 2009

В CouchDB, как и в Lotus Notes, вы действительно не должны думать о документе как об аналоге строки.

Вместо этого Документ представляет собой отношение (таблица).

Каждый документ имеет количество строк - значения полей:

ValueID(PK)  Document ID(FK)   Field Name        Field Value
========================================================
92834756293  MyDocument        First Name        Richard
92834756294  MyDocument        States Lived In   TX
92834756295  MyDocument        States Lived In   KY

Каждое представление представляет собой перекрестный запрос, который выбирает большой массив UNION ALL каждого документа.

Итак, это все еще реляционный, но не в самом интуитивном смысле и не в том смысле, который важнее всего: хорошие практики управления данными.

4 голосов
/ 25 июня 2009

Документно-ориентированные базы данных не отвергают концепцию отношений, они просто иногда позволяют приложениям разыменовывать ссылки (CouchDB) или даже имеют прямую поддержку отношений между документами (MongoDB). Что более важно, так это то, что DODB не содержат схем. В табличных хранилищах это свойство может быть достигнуто со значительными накладными расходами (см. Ответ richardtallent), но здесь это делается более эффективно. Что мы действительно должны изучить при переходе от СУБД к DODB, так это забыть о таблицах и начать думать о данных. Это то, что овечный симулятор называет «восходящим» подходом. Это постоянно развивающаяся схема, а не предопределенная прокрустово ложе. Конечно, это не означает, что схемы должны быть полностью оставлены в любой форме. Ваше приложение должно интерпретировать данные, каким-то образом ограничивать их форму - это можно сделать, организовав документы в коллекции, создав модели с методами проверки - но теперь это задача приложения.

2 голосов
/ 25 июня 2009

может быть, вы должны прочитать это http://books.couchdb.org/relax/getting-started

Я сам только что услышал это, и это интересно, но я не знаю, как реализовать это в реальном приложении;)

1 голос
/ 25 июня 2009

Одна вещь, которую вы можете попробовать, это получить копию firefox и firebug и поиграть с функциями map и , которые уменьшают в javascript. они на самом деле довольно крутые и забавные, и, кажется, являются основой того, как добиться успеха в CouchDB

вот небольшая статья Джоэла на эту тему: http://www.joelonsoftware.com/items/2006/08/01.html

...