Дизайн реляционной базы данных
Мне интересно узнать о стратегиях разработки, которые вы использовали с нереляционными базами данных nosql - то есть (в основном новый) класс хранилищ данных, которые не используют традиционные реляционные дизайн или SQL (например, Hypertable, CouchDB, SimpleDB, хранилище данных Google App Engine, Voldemort, Cassandra, службы данных SQL и т.д.). Они также часто упоминаются как "хранилища ключей/значений", а на основе они действуют как гигантские распределенные постоянные хеш-таблицы.
В частности, я хочу узнать о различиях в разработке концептуальных данных с этими новыми базами данных. Что проще, что еще сложнее, чего нельзя вообще сделать?
-
Придумали ли вы альтернативные проекты, которые намного лучше работают в нереляционном мире?
-
Ты ударился головой о все, что кажется невозможным?
-
Вы объединили пробел с любыми шаблонами проектирования, например. переводить с одного на другого?
-
Вы вообще делаете явные модели данных вообще (например, в UML), или вы полностью их удалили в пользу полуструктурированных/документированных данных blobs?
-
Пропускаете ли вы какие-либо из основных дополнительных сервисов, которые предоставляют RDBMS, такие как реляционная целостность, произвольно сложная поддержка транзакций, триггеры и т.д.?
Я исхожу из базы данных реляционных баз данных SQL, поэтому нормализация в моей крови. Тем не менее, я получаю преимущества нереляционных баз данных для простоты и масштабирования, и моя кишка говорит мне, что должно быть более богатое перекрытие возможностей дизайна. Что вы сделали?
FYI, были обсуждения StackOverflow на похожие темы здесь:
Ответы
Ответ 1
Я думаю, вы должны учитывать, что нереляционная СУБД сильно отличается от своей модели данных, поэтому дизайн концептуальных данных также будет сильно отличаться. В потоке Дизайн данных в нереляционных базах данных NOSQL Google группа, различные парадигмы классифицируются следующим образом:
- Системы с большими таблицами (HBase,
Hypertable и т.д.)
- Ключевые ценности магазинов (Токио, Волдеморт,
и т.д.)
- Базы данных документов (CouchDB,
MongoDB и т.д.)
- Графические базы данных (AllegroGraph,
Neo4j, Sesame и т.д.)
Я в основном в графических базах данных, и элегантность дизайна данных с использованием этой парадигмы была тем, что привело меня туда, устав от недостатков RDBMS. Я привел несколько примеров построения данных, используя базу данных графа на этой странице wiki и там пример того, как моделировать базовый IMDB фильм/данные о роли/роли.
Презентационные слайды (слайд-шоу) Графические базы данных и будущее крупномасштабного управления знаниями Марко Родригес содержит очень хорошее введение в проектирование данных, используя также базу данных графа.
Отвечая на конкретные вопросы с точки зрения graphdb:
Альтернативный дизайн: добавление связей между многими различными типами сущностей без каких-либо забот или необходимость предопределять, какие сущности могут подключиться.
Преодоление разрыва: я стараюсь делать это по-другому для каждого случая, основываясь на самом домене, поскольку мне не нужен "ориентированный на таблицу граф" и тому подобное. Тем не менее, здесь некоторая информация о автоматическом переводе из РСУБД в graphdb.
Явные модели данных: я делаю это все время (стиль доски), а затем использую модель так же, как и в БД.
Мисс из мира РСУБД: простые способы создания отчетов. Обновление: возможно, не так сложно создавать отчеты из базы данных графов, см. Создание отчета для базы данных Neo4J Sample.
Ответ 2
Я только начинал с нереляционных БД, и я все еще пытаюсь обвести вокруг него голову и выяснить, какая будет лучшая модель. И я могу говорить только за CouchDB.
Тем не менее, у меня есть некоторые предварительные выводы:
Придумали ли вы альтернативные проекты, которые намного лучше работают в нереляционном мире?
Сдвиг фокуса дизайна: дизайн модели документа (соответствующий таблицам БД) становится почти нерелевантным, в то время как все зависит от проектирования представлений (соответствующих запросам).
Тип документа DB свопирует сложности: SQL имеет негибкие данные и гибкие запросы, документы DB - это наоборот.
Модель CouchDB представляет собой набор "документов JSON" (в основном вложенных хеш-таблиц). Каждый документ имеет уникальный идентификатор и может быть тривиально извлечен по идентификатору. Для любого другого запроса вы пишете "представления", которые называются наборами функций map/reduce. Представления возвращают набор результатов как список пар ключ/значение.
Фокус в том, что вы не запрашиваете базу данных в том смысле, что вы запрашиваете базу данных SQL: результаты запуска функций просмотра хранятся в индексе, и только запрос может быть запрошен. (Как "получить все", "получить ключ" или "получить диапазон клавиш".)
Ближайшей аналогией в мире SQL было бы, если бы вы могли запросить только БД с помощью хранимых процедур - каждый запрос, который вы хотите поддерживать, должен быть предопределен.
Дизайн документов чрезвычайно гибкий. Я нашел только два ограничения:
- Храните связанные данные вместе в одном документе, так как ничего не соответствует соединению.
- Не делайте документы настолько большими, что они обновляются слишком часто (например, все продажи компании за год в одном документе), поскольку каждое обновление документа вызывает повторную индексацию.
Но все зависит от разработки представлений.
В альтернативных конструкциях я обнаружил, что лучше работать с CouchDB на порядок работы, чем любая база данных SQL на системном уровне, а не на уровне хранилища. Если у вас есть данные и вы хотите их обслуживать на веб-странице, сложность общей системы уменьшается не менее чем на 50%:
- нет таблиц проектирования (незначительная проблема)
- промежуточный уровень ODBC/JDBC, все запросы и транзакции по http (умеренная проблема)
- простое сопоставление DB-to-object из JSON, которое почти тривиально по сравнению с тем же в SQL (важно!)
- вы можете пропустить весь сервер приложений, так как вы можете проектировать ваши документы, которые будут извлекаться непосредственно браузером с помощью AJAX, и добавить немного полировки JavaScript до того, как они будут отображаться как HTML. (ОГРОМНЫЙ!!)
Для обычных webapps базы данных на основе документов /JSON являются массивной победой, а недостатки менее гибких запросов и некоторый дополнительный код для проверки данных кажутся небольшой ценой.
Вы ударились головой о все, что кажется невозможным?
Пока нет. Карта/сокращение как средство запроса к базе данных незнакомо и требует гораздо большего мышления, чем написания SQL. Существует довольно небольшое количество примитивов, поэтому получение нужных результатов - это прежде всего вопрос творческого подхода к тому, как вы указываете ключи.
Существует ограничение в том, что запросы не могут смотреть на два или более документов одновременно - никаких соединений или других видов отношений с несколькими документами, но до сих пор ничего не было непреодолимым.
В качестве примера ограничение, подсчеты и суммы легко, но средние значения не могут быть вычислены с помощью представления/запроса CouchDB. Исправить: вернуть сумму и счетчик отдельно и вычислить среднее значение на клиенте.
Удалили ли вы пробел с любыми шаблонами проектирования, например. переводить от одного к другому?
Я не уверен, что это возможно. Это скорее полная редизайн, например, перевод функциональной программы стиля в объектно-ориентированный стиль. В общем, существует гораздо меньше типов документов, чем в каждом документе есть таблицы SQL и больше данных.
Один из способов подумать о том, чтобы посмотреть на ваш SQL для вставок и общих запросов: какие таблицы и столбцы обновляются, например, когда клиент размещает заказ? И какие из них для ежемесячных отчетов о продажах? Эта информация должна, вероятно, идти в том же документе.
То есть: один документ для заказа, содержащий идентификаторы клиентов и идентификаторы продуктов, с реплицированными полями, необходимыми для упрощения запросов. Все, что содержится в документе, может быть легко запрошено, все, что требует перекрестной ссылки между "Заказчиком" и "Клиент", должно выполняться клиентом. Поэтому, если вам нужен отчет о продажах по регионам, вероятно, вы должны поместить код региона в порядок.
Вы вообще делаете явные модели данных вообще (например, в UML)?
Извините, никогда не делал UML перед документами DB:):)
Но вам нужна какая-то модель, в которой указаны поля, в каких документах и какие значения они содержат. Как для вашей собственной ссылки позже, так и для обеспечения того, чтобы каждый бот с использованием БД знал соглашения. Так как вы больше не получаете сообщение об ошибке, если вы храните дату в текстовом поле, например, и каждый может добавить или удалить любое поле, которое они чувствуют, вам нужен как код проверки, так и соглашения, чтобы получить слабину. Особенно, если вы работаете с внешними ресурсами.
Пропускаете ли вы какие-либо из основных дополнительных сервисов, предоставляемых RDBMS?
Неа. Но мой фон - разработчик веб-приложений, мы имеем дело с базами данных только в той степени, в которой мы должны:
Компания, с которой я работал, создала продукт (webapp), который был разработан для работы с базами данных SQL от нескольких поставщиков, а "дополнительные службы" настолько отличаются от БД к БД, что они должны были быть реализованы отдельно для каждой БД. Таким образом, нам было меньше работать, чтобы вывести функциональность из РСУБД. Это даже расширилось до полнотекстового поиска.
Итак, все, что я сдаюсь, - это то, чего я никогда не видел в первую очередь. Очевидно, что ваш опыт может отличаться.
Оговорка: теперь я работаю в Интернете для получения финансовых данных, котировок акций и т.п. Это очень хорошее соответствие для DB документа, с моей точки зрения, я получаю все преимущества БД (постоянство и запросы) без каких-либо проблем.
Но эти данные довольно независимы друг от друга, нет сложных реляционных запросов. Получайте последние цитаты по тикеру, получайте котировки по тикеру и диапазону дат, получите мета-информацию компании, что почти все это. Еще один пример, который я видел, - это приложение для блога, а блоги не характеризуются массово сложными схемами базы данных.
То, что я пытаюсь сказать, состоит в том, что все успешные приложения из базы данных документов, которые я знаю, были с данными, в которых в первую очередь не было много взаимосвязей: документы (как в поиске Google), сообщения в блогах, новостные статьи, финансовые данные.
Я ожидаю, что есть наборы данных, которые лучше сопоставляются с SQL, чем с моделью документа, поэтому я думаю, что SQL выживет.
Но для тех из нас, кто просто хочет простой способ хранения и извлечения данных, и я подозреваю, что многие из нас - базы данных документов (как в CouchDB) - это находка.
Ответ 3
Я отвечаю на это с CouchDB в глубине моего разума, но я бы предположил, что большинство будет справедливо и для других БД. Мы рассмотрели использование CouchDB, но, наконец, решили против него, так как наш доступ к данным неизвестен заранее, и масштабируемость не является проблемой.
Harder:
- Переосмысливает концептуальный уровень, поэтому он "сложнее", поскольку он просто другой. Поскольку вы заранее должны знать свои шаблоны доступа к данным, автоматический перевод не может быть применен. Вам нужно будет добавить шаблон доступа по крайней мере.
- Консистенция не обрабатывается базой данных, но должна быть рассмотрена в приложении. Меньше гарантий означает более легкую миграцию, отказоустойчивость и лучшую масштабируемость за счет более сложного приложения. Приложение должно иметь дело с конфликтами и несоответствиями.
- Ссылки, которые перекрещивают документы (или ключ/значение), также должны обрабатываться на уровне приложений.
- В SQL-типах баз данных есть IDE, которые намного более зрелые. Вы получаете много библиотек поддержки (хотя разбиение этих библиотек делает вещи намного более сложными, чем необходимо для SQL).
проще:
- Быстрее, если вы знаете свои шаблоны доступа к данным.
- Migration/Fail-over проще для базы данных, так как no promises сделана вам в качестве прикладного программиста. Хотя вы получаете возможную последовательность. Вероятно. В заключение. Некоторое время.
- Один ключ/значение намного легче понять, чем одна строка из таблицы. Все (древовидные) отношения уже включены, и могут быть распознаны полные объекты.
Моделирование должно быть примерно таким же, но вы должны быть осторожны с тем, что вы ввели в один документ: UML также может использоваться как для моделирования OO, так и для моделирования БД, которые уже являются двумя разными животными.
Мне бы хотелось увидеть хорошую открытую базу данных OO, хорошо интегрированную с С#/Silverlight. Просто сделать выбор еще сложнее.:)
Ответ 4
Плоские файлы уже давно считаются тайными и непрактичными для набора данных любого размера. Однако более быстрые компьютеры с большей памятью позволяют загружать файл в память и сортировать его в режиме реального времени, по крайней мере, для достаточно небольших n и локальных однопользовательских приложений.
Например, вы можете обычно читать файл из 10 000 записей и сортировать его в поле менее чем за полсекунды, приемлемое время отклика.
Конечно, есть причины использовать базу данных вместо плоских файловых реляционных операций, целостности данных, многопользовательской возможности, удаленного доступа, большей емкости, стандартизации и т.д., но увеличенная скорость компьютера и объем памяти в - в некоторых случаях манипулирование данными более практично.
Ответ 5
Реляционные базы данных, которые я вижу в реальной жизни, как правило, не очень хорошо нормализуются вообще, вопреки вашим требованиям. Когда его спросили, дизайнеры говорят мне, что это в основном из-за производительности. RDBM не подходят для соединения, поэтому таблицы имеют тенденцию быть слишком широкими с точки зрения нормализации. Объектно-ориентированные базы данных, как правило, намного лучше.
Еще одна проблема, с которой возникают проблемы с RDBM, - это обработка ключей истории/времени.