Я изучаю реализацию объектной версии с добавленным завихрением, требующим иметь как живые, так и черновики объектов, и мог бы использовать идеи, полученные от кого-то в этом, поскольку я начинаю задаваться вопросом, возможно ли это даже без потенциального ужасные хаки.
Я буду разбивать его на сообщения с тегами ради примера, но мой прецедент немного более общий (с участием медленно меняющихся измерений - http://en.wikipedia.org/wiki/Slowly_changing_dimension).
Предположим, что у вас есть таблица сообщений, таблица тегов и таблица post2tag:
posts (
id
)
tags (
id
)
post2tag (
post_id fkey posts(id),
tag_id fkey tags(id)
)
Мне нужно несколько вещей:
- Возможность показать, как выглядит сообщение в произвольном datetime, в том числе для удаленных строк.
- Следите за тем, кто редактирует, для полного аудита.
- Требуется набор материализованных представлений ( "живых" таблиц) для сохранения ссылочной целостности (т.е. регистрация должна быть прозрачной для разработчиков).
- Нужно быть соответствующим образом быстро для живых и последних черновиков строк.
- Возможность иметь черновик сообщения сосуществует с живым сообщением.
Я изучал различные варианты. Пока что лучшее, что я придумал (без очков # 4/# 5), немного похоже на SCD type6-hybrid setup, но вместо того, чтобы иметь текущее логическое, есть материализованное представление для текущей строки. Для всех целей и целей это выглядит так:
posts (
id pkey,
public,
created_at,
updated_at,
updated_by
)
post_revs (
id,
rev pkey,
public,
created_at,
created_by,
deleted_at
)
tags (
id pkey,
public,
created_at,
updated_at,
updated_by
)
tag_revs (
id,
public,
rev pkey,
created_at,
created_by,
deleted_at
)
post2tag (
post_id fkey posts(id),
tag_id fkey tags(id),
public,
created_at,
updated_at,
updated_by
)
post2tag_revs (
post_id,
tag_id,
post_rev fkey post_revs(rev), -- the rev when the relation started
tag_rev fkey tag_revs(rev), -- the rev when the relation started
public,
created_at,
created_by,
deleted_at,
pkey (post_rev, tag_rev)
)
Я использую pg_temporal для поддержания индексов в период (created_at, deleted_at). И я держу различные таблицы в синхронизации с помощью триггеров. Yada yada yada... Я создал триггеры, которые позволяют отменить редактирование сообщений/тегов таким образом, что черновик будет храниться в оборотах без публикации. Он отлично работает.
За исключением случаев, когда мне нужно беспокоиться о связанных с строк строк отношениях post2tag. В этом случае все ад разрывается, и это намекает мне, что у меня есть какая-то проблема дизайна. Но у меня заканчиваются идеи...
Я рассмотрел возможность введения дублирования данных (т.е. n строк post2tag, введенных для каждого проекта пересмотра). Такие работы, но, как правило, намного медленнее, чем хотелось бы.
Я рассмотрел введение таблиц чертежей для "последнего проекта", но это быстро становится очень уродливым.
Я рассмотрел всевозможные флаги...
Итак, вопрос: существует ли общепринятое средство управления живыми и неживыми строками в контролируемой среде с версией строки? А если нет, то что вы пробовали и были достаточно успешны?