Моделирование данных в продукт datomic
Я искал в Datomic, и это выглядит очень интересно. Но пока вроде бы есть очень хорошая информация о том, как Datomic работает технически, Я не видел много о том, как следует думать о моделировании данных.
Каковы некоторые лучшие практики для моделирования данных в Datomic? Есть ли хорошие ресурсы по этому вопросу?
2 ответов:
Будьте Осторожны Лектор
поскольку Datomic является новым, и мой опыт работы с ним ограничен, этот ответ никоим образом не следует рассматривать как передовую практику. Вместо этого возьмите это как введение в Datomic для тех, кто имеет реляционный фон и жаждет более продуктивного хранилища данных.
Начало Работы
в Datomic вы моделируете данные своего домена как объекты что обладают значения на атрибуты. Потому что ссылка на другую сущности может быть стоимостью на атрибут, вы можете модель отношения между объекты просто.
на первый взгляд, это не так уж отличается от способа моделирования данных в традиционной реляционной базе данных. В SQL строки таблицы являются объекты и имя столбцов таблицы атрибуты что есть значения. Один отношения представляет собой внешний ключ стоимостью в одной строке таблицы, ссылающийся на первичный ключ стоимостью другой строке таблицы.
это сходство приятно, потому что вы можете просто набросать свои традиционные диаграммы ER при моделировании вашего домена. Вы можете полагаться на отношения так же, как и в базе данных SQL, но не нужно возиться с внешними ключами, так как это обрабатывается для вас. Записи в Datomic являются транзакционными и ваши чтения последовательны. Таким образом, вы можете разделить свои данные на сущности с любой степенью детализации, полагаясь на соединения, чтобы обеспечить более широкую картину. Это удобство, которое вы теряете со многими магазинами NoSQL, где обычно есть большие денормализованные сущности для достижения некоторого полезного уровня атомарности во время обновлений.
на данный момент, Вы находитесь в хорошем начале. Но Datomic гораздо более гибкий, чем база данных SQL.
С Преимущество
время по своей сути является частью всех данных Datomic, поэтому нет необходимости специально включать историю ваших данных как часть вашей модели данных. Это, вероятно, наиболее обсуждаемый аспект Datomic.
в Datomic ваша схема не жестко определена в "прямоугольной форме", требуемой SQL. То есть, сущность1 может иметь любые атрибуты, необходимые для удовлетворения вашей модели. Сущность не должна иметь
NULLили значения по умолчанию для атрибуты, которые к нему не относятся. И вы можете добавить атрибуты к определенной, индивидуальной сущности, как вы считаете нужным.таким образом, вы можете изменить форму отдельных объектов с течением времени, чтобы реагировать на изменения в вашем домене (или изменения в вашем понимании домена). Ну и что? Это не отличается от хранилищ документов, таких как MongoDB и CouchDB.
разница в том, что с Datomic вы можете ввести изменения схемы атомарно над всеми затронутыми объектами. Это означает, что вы можете выдать транзакцию для обновления формы всех сущностей,на основе произвольной логики домена,на русском языке[2], который будет выполняться без влияния на читателей до фиксации. Я не знаю ничего близкого к такой власти ни в реляционных, ни в хранилищах документов пространствах.
ваши сущности также не жестко определены как" живущие в одной таблице". Вы сами решаете, что определяет " тип " объекта в Продукт datomic. Вы можете выбрать, чтобы быть явным и мандат, что каждый объект в вашей модели будет иметь
:tableатрибут, который означает, что это "тип". Или ваши сущности могут соответствовать любому количеству "типов", просто удовлетворяя требованиям атрибутов каждого типа.например, ваша модель может поручить это:
- человеку требуются атрибуты
:name,:ssn,:dob- сотрудник требуется
:name,:title,:salary- житель требует
:name,:address- член требует
:id,:plan,:expirationчто означает сущность вроде меня:
{:name "Brian" :ssn 123-45-6789 :dob 1976-09-15 :address "400 South State St, Chicago, IL 60605" :id 42 :plan "Basic" :expiration 2012-05-01}можно сделать вывод, что это
Person, aResidentи aMemberа не anEmployee.запросы Datomic выражаются в Регистрация и может включать в себя правила, выраженные на вашем родном языке, ссылки данные и ресурсы, которые не хранятся в Datomic. Вы можете хранить Функции Работы С Базами Данных как первоклассные значения внутри Datomic. Они напоминают хранимые процедуры в SQL, но могут быть обработаны как значения внутри транзакции, а также написаны на вашем языке. Обе эти функции позволяют выражать запросы и обновления более доменно-ориентированным способом.
наконец,импеданс несоответствие между ОО и реляционными мирами всегда расстроил меня. Использование функционального, ориентированного на данные языка (Clojure) помогает в этом, но Datomic стремится обеспечить надежное хранилище данных, которое не требует умственной гимнастики для перехода от кода к хранилищу.
например, сущность, полученная из Datomic, выглядит и действует как карта Clojure (или Java). Он может быть передан на более высокие уровни приложения без перевода в экземпляр объекта или общую структуру данных. Прохождение отношений этого объекта приведет к извлечению связанные сущности из Datomic лениво. Но с гарантией, что они будут соответствовать исходному запросу, даже в условиях одновременных обновлений. И эти сущности будут казаться простыми старыми картами, вложенными в первую сущность.
это делает моделирование данных более естественным и гораздо, гораздо меньше борьбы, на мой взгляд.
Потенциальные Проблемы
противоречивые атрибуты
приведенный выше пример иллюстрирует потенциальная ловушка в вашей модели. Что делать, если вы позже решите, что
:idтакже является атрибутом элементаEmployee? Решение состоит в том, чтобы организовать ваши атрибуты в пространства имен. Так что вы бы оба:member/idи:employee/id. Делать это раньше времени, помогает избежать конфликтов в дальнейшем.определение атрибута не может быть изменено (пока)
как только вы определили атрибут в своей Datomic как определенный тип, индексированный или нет, уникальный, так далее. вы не можете изменить это позже. Мы говорим
ALTER TABLE ALTER COLUMNна языке SQL здесь. На данный момент Вы можете создать атрибут замены с правильным определением и переместить существующие данные.это может звучать ужасно, но это не так. Поскольку транзакции сериализованы, вы можете отправить тот, который создает новый атрибут, копирует в него ваши данные, разрешает конфликты и удаляет старый атрибут. Он будет работать без вмешательства со стороны других транзакций и может воспользоваться доменная логика на вашем родном языке, чтобы сделать это вещь. Это по существу то, что СУБД делает за кулисами, когда вы выпускаете
ALTER TABLE, но вы называете правила.не будь "ребенком в кондитерской"
гибкая схема не означает отсутствие модели данных. Я бы посоветовал некоторым заранее планировать моделирование вещей в здравом уме, так же, как и для любого другого хранилища данных. Используйте гибкость Datomic в будущем, когда вы есть к, не только потому, что вы можете.
избегайте хранения больших, постоянно меняющихся данных
Datomic не является хорошим хранилищем данных для больших двоичных объектов или очень больших данных, которые постоянно меняются. Потому что он хранит историческую запись предыдущих значений, и нет метода для очистки более старых версий (пока). Такие вещи почти всегда лучше подходят для хранения объектов, таких как S3. Обновление: есть способ отключить историю для каждого атрибута основа.
ресурсы
- список рассылки Datomic
- IRC канал #datomic на Freenode
Примечания
- я имею в виду сущность в смысле строки, а не в смысле таблицы, которая более правильно описывается как тип сущности.
- я понимаю, что Java и Clojure в настоящее время поддерживаются, но возможно, что другие языки JVM могут поддерживаться в будущем.
очень хороший ответ от bkirkbri. Я хочу внести некоторые дополнения:
если вы храните много объектов похожих, но не равных "типов" или схем, используйте ключевое слово типа в схеме, например
{: db / id #db / id [: db.часть/дБ] :db / ident :артикул / тип : db / valueType :db.тип/номер модели / ref : дБ / Мощность :дБ.мощность / один : db / doc " тип статьи" :децибел.install / _attribute: db.часть/дБ}
когда вы читаете их, получим entity-ids из запроса и использовать
datomic.api/entityиeidи анализировать их с помощью мультиметодов диспетчеризации по типу, если это необходимо, так как трудно сделать хороший запрос для всех атрибутов в какой-то более сложной схеме.
Comments