Существуют ли шаблоны проектирования для битемпоральных баз данных NoSQL?
Мне любопытно, если кто-нибудь реализовал или даже знает какие-либо битемпоральные базы данных, построенные на платформах NoSQL (например, riak).
4 ответа
Я не знаю ни одного хранилища данных NoSQL, специально разработанного для обработки временных данных. Чтобы поместить действительные периоды и периоды транзакций в данные в Riak, вам необходимо:
Оберните ваши документы / значения структурой, которая может содержать метаданные, такие как:
{meta: {valid: ["2001-11-08", "2001-11-09"], транзакция:["2011-01-29 10:27:00", "2011-01-29 10:28:00"] } payload:" Это фактический документ / значение, которое я хочу сохранить!" }
Создайте "мета-документ" для каждого документа и используйте Riak Links, чтобы связать их.
Я думаю, что это немного чище, но если вам нужно извлечь эти времена часто, то этот метод может быть слишком медленным.
Если вы хотите получить документы по времени, то я не думаю, что Riak (или любые другие известные мне хранилища ключей / значений) будет правильным хранилищем данных для использования. SQL или, возможно, какая-то система BigTable может быть вашим единственным хорошим вариантом.
Чтобы поддерживать битемпоральную (или временную модель БД), вам нужны кислотные транзакции, чтобы выполнить правильный DML для обновления и вставки записей в двух измерениях времени (действительное / эффективное время и транзакция / системное время). Смотрите подробности о временном моделировании.
Например, популярные базы данных NoSQL, такие как Cassandra, MongoDB, Couchbase, не имеют поддержки ACID для выполнения необходимых операций обновления / вставки записи, необходимых для поддержки битемпоральной манипуляции с записями. С временными и битемпоральными базами данных записи никогда не должны перекрываться, и записи должны корректно завершаться при их замене последующими действительными записями / записями времени транзакции.
База данных MarkLogic NoSQL утверждает, что поддерживает bitemporal, но никогда не пробовала и не является открытым исходным кодом. Но вы можете применить собственное решение, используя базу данных ACID, которая эффективно функционирует как журнал отслеживания действительного / транзакционного времени, а затем использовать NoSQL для фактического хранилища данных. Смотрите высокоуровневое описание этого подхода здесь.
Я написал небольшой битемпоральный слой базы данных с открытым исходным кодом на основе Mongodb:
https://github.com/1123/bitemporaldb
При хранении объектов Scala или Java объект оборачивается в общий битемпоральный объект с битемпоральной метаинформацией (действительное время, время транзакции). Впоследствии он сериализуется в JSON и сохраняется как BSON в MongoDB.
Он прозрачно обрабатывает временные и невременные обновления объектов. Возможен поиск по битемпоральному контексту.
Документно-ориентированные базы данных для битемпоральных данных полезны, так как документно-ориентированное хранилище уменьшает количество объединений для извлечения данных. Объединения в битемпоральном контексте могут быть неэффективными и трудными для написания вручную.
Отзывы, предложения и пожелания приветствуются.
Из Википедии:
"Битемпоральные данные - это концепция, используемая во временной базе данных. Она обозначает как действительное время, так и время транзакции данных. В таблице базы данных битемпоральные данные часто представлены четырьмя дополнительными столбцами таблицы StartVT и EndVT, StartTT и EndTT. Каждый раз интервал закрыт на своей нижней границе и открыт на своей верхней границе."
То есть вы не можете просто поместить эти четыре значения в свои данные?