§22
Нереляционные базы данных
Проблемы реляционных БД
Несмотря на то что реляционные (табличные) БД хорошо себя зарекомендовали и составляют подавляющее большинство реально используемых баз данных, они не универсальны и в некоторых задачах их применение приводит к серьёзным проблемам.
Во-первых, для того чтобы построить надёжно работающую реляционную БД, необходимо представить исходные данные как набор взаимосвязанных таблиц. Это требует серьёзных усилий, кроме того, данные становятся менее понятными для человека, потому что он мыслит не таблицами, а объектами, которые имеют определённый набор свойств.
Во-вторых, данные, связанные с одним объектом, разбросаны по разным таблицам, поэтому при поиске их приходится «вытаскивать» с помощью сложных запросов, которые выполняются сравнительно медленно при больших объёмах данных.
В-третьих, во всех реляционных базах данных структура данных чётко определена, причем она задаётся разработчиком при создании базы, и изменить её весьма непросто. Теперь представим себе, что нам нужно хранить документы, которые могут иметь разное количество свойств с разными названиями и типами данных, причём эти свойства заранее не определены и могут меняться со временем. В этом случае использовать реляционные БД, по крайней мере, очень сложно, поскольку они для этой цели не предназначены.
В-четвёртых, объемы данных, которые нужно обрабатывать, всё время возрастают, сейчас базы данных поисковых систем могут достигать нескольких петабайтов. Поэтому один компьютер с этим справиться не в силах (система может получать сотни тысяч запросов в секунду). Возникает задача распределить нагрузку на большое количество (иногда десятки тысяч) серверов, связанных между собой через Интернет. Если при этом применять реляционную базу данных, то для выполнения даже простых запросов нужно обращаться ко многим серверам, это недопустимо замедляет поиск. Подобная проблема возникает при «облачных» вычислениях, при которых данные пользователя хранятся на серверах в Интернете. Таким образом, реляционные БД хороши, когда вся база находится на одном компьютере, но они плохо масштабируются. Это значит, что при увеличении объема данных и количества запросов не удаётся увеличивать мощность системы, просто добавляя новые сервера. Причина в том, что реляционная модель плохо подходит для распределённых информационных систем.
Базы данных «ключ — значение»
В последние годы появились базы данных нового типа, получившие название «ключ — значение» (англ. «key-value» database), которые хорошо показали себя в распределённых системах с большой нагрузкой, в том числе в поисковых системах Интернета.
Базу данных «ключ — значение» можно представить себе как огромную таблицу, в каждой ячейке которой могут храниться произвольные данные («значения»), их структура никак не ограничена. Каждому значению присваивается некоторый код («ключ*), по которому его можно найти. Все данные, относящиеся к конкретном объекту, хранятся в одном месте, поэтому при запросе не нужно обращаться к разным таблицам, а достаточно просто найти значение по ключу.
СУБД поддерживает только добавление записи, поиск значения по ключу, а также изменение и удаление найденной таким образом записи. Никакие связи между значениями в явном виде не поддерживаются. Хотя объект может содержать ссылки на другие объекты (их ключи), СУБД не проверяет их правильность. Обеспечение надёжности и целостности данных возлагается не на СУБД, а на прикладную программу, которая работает с базой данных.
Ключи — это хэш-коды хранящихся данных (значений). Ключи объединяются в группы так, что все данные, связанные с ключами одной группы, хранятся на одном сервере. Таким образом, по ключу можно сразу определить нужный сервер и напрямую получить от него данные. За счет этого обеспечивается масштабируемость — если один сервер не справляется с нагрузкой, нужно добавить ещё один и разделить данную группу ключей на две части.
Многие базы типа «ключ — значение» хранят документы — объекты, которые имеют произвольный набор полей-свойств, например:
{
ключ: 1231239786234762394769237
автор: "А.С. Пушкин"
название: "Евгений Онегин"
}
Важно, что другие документы могут иметь совершенно другой набор полей. Такие базы данных называют документоориентированными.
Итак, базы данных «ключ — значение» обладают достоинствами, которые принципиально важны в некоторых задачах:
- масштабируемость — возможность наращивания мощности распределенной системы простым добавлением новых серверов;
- простота представления данных, близость к человеческому восприятию.
В то же время у них есть и недостатки:
- СУБД не поддерживают связи между данными, не обеспечивает целостность данных;
- нет стандарта на язык описания и управления данными (для реляционных БД таким стандартом стал язык SQL);
- основной вид запросов — поиск значения по ключу, поэтому очень сложно, например, выполнить сортировку данных.
В первую очередь, базы данных «ключ — значение» используются при «облачных» вычислениях: в поисковой системе Google (система хранения данных BigTable), интернет-магазине Amazon (www.amazon.com, база данных SimpleDB), энциклопедии Википедия (ru.wikipedia.org), социальной сети Facebook (www. facebook.com).
Кроме того, есть бесплатные СУБД этого класса, например MongoDB (www.mongodb.org) или CouchDB (couchdb.apache, org).
Вопросы и задания
1. Назовите недостатки реляционных БД. В каких задачах они проявляются?
2. Что такое распределённые базы данных?
3. Что такое масштабируемость? Почему реляционные БД плохо масштабируются?
4. Как вы понимаете выражение «ключ — значение»?
5. Как обеспечиваются связи между объектами в таких БД? Как обеспечивается целостность данных?
6. Вспомните, что такое хэширование и хэш-коды. Как можно выполнить масштабирование на основе хэш-кодов?
7. Что такое документоориентированные базы данных?
8. Назовите достоинства и недостатки баз данных типа «ключ — значение». В каких задачах их имеет смысл использовать?
9. Что вы думаете о дальнейшей судьбе реляционных БД в связи с появлением новых принципов хранения данных? Проведите исследование.
Подготовьте сообщение
«Нереляционные базы данных: за и против»
Задача
*Попробуйте поработать с какой-нибудь документоориентированной СУБД.