Использование реляционной базы данных для данных без схемы - лучшие практики
После прочтения шокирующей статьи, написанной Бретом Тейлором (одним из создателей FriendFeed; текущий технический директор Facebook), " Как FriendFeed использует MySQL для хранения данных без схемы", я начал задаваться вопросом, существуют ли лучшие практики использования СУБД, такие как Oracle, MySQL или PostgreSQL для хранения и запроса данных без схемы?
Мало кому нравится признавать, что они используют реляционную базу данных, когда NoSQL - это новая популярность, которая затрудняет поиск хороших статей по этой теме. Как реализовать бессхемную (или "ориентированную на документы") базу данных в качестве слоя поверх реляционной базы данных?
5 ответов
Вот классическая статья в этой теме: http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html (Использование MySQL в качестве NoSQL - история о превышении 750 000 qps на товарный сервер)
Хранение данных без схемы в SQL в основном означает реализацию хранилища значений ключей, которое использует SQL в качестве внутреннего компонента. Поскольку вы не используете никаких реляционных функций, а схема довольно тривиальна, вы не найдете много информации о проектировании баз данных SQL таким образом. Однако вы сможете найти множество более общей информации о разработке приложений для хранения значений ключей, которые будут применяться.
Я тщательно исследовал эту проблему. Довольно просто моделировать данные без схемы в СУБД с использованием таблицы "свойств" (по существу, с использованием пар ключ / значение). Сложная часть - это индексирование и запросы к вашим вещам. (По сути, вся сложность, с которой сталкивался Friendfeed, была связана с этой проблемой.)
Если вы индексируете таблицу свойств, вы получаете индекс для всех свойств. Это нежелательно, так как добавляет слишком много накладных расходов, поскольку вам нужно запрашивать только определенные свойства. Также вам наверняка захочется получить доступ к вашим вещам через составные индексы. Моделировать составные индексы невероятно сложно. Единственные решения, которые я нашел, требуют, чтобы вы строили свои собственные индексы, используя схему только для этой цели - очень громоздко. Чем больше я смотрел на это, тем менее практичным это выглядело.
Хорошее решение этой проблемы заключается в использовании частичных индексов (иначе говоря, фильтрованных индексов).
Вы не найдете много на эту тему, потому что большинство людей создают решения для одной цели. Их решения предназначены для удовлетворения одной потребности очень хорошо. Базы данных NoSQL значительно облегчают создание этих специализированных хранилищ данных, но вы платите за отсутствие гибкости и некоторых встроенных элементов управления и функций безопасности СУБД.
Инженеры Quora используют MySQL в качестве хранилища данных вместо NoSQL, таких как Cassandra, MongoDB, CouchDB и т. Д. Они разделяют данные на уровне приложения, что означает, что они разделяют данные только при необходимости, сохраняют данные на одном компьютере, если это возможно, и используют хэш первичного ключа для разделения больших наборов данных по нескольким базам данных. Разделение данных на уровне приложения работает таким образом, что данные, отвечающие одному набору критериев, "передаются" в одну базу данных, тогда как данные, не соответствующие этим критериям (или, возможно, другому набору критериев), могут отправляться в другую базу данных.