Err ... Serial не делает первичный ключ. Вы должны фактически объявить это как таковой, чтобы получить индекс. И тип периода необходим, чтобы установить 1) ограничение исключения с использованием gist и 2) эффективное использование индекса для коррелированных столбцов. Спасибо за предложение, хотя. :)

трю на реализацию версионирования объектов с дополнительным поворотом необходимости иметь как живые, так и черновые объекты, и мог бы использовать информацию, полученную от кого-то, испытавшего это, поскольку я начинаю задаваться вопросом, возможно ли это вообще без потенциально ужасных хаков.

Я расскажу об этом в статьях с тегами для примера, но мой пример использования немного более общий (в том числе медленно меняющиеся размеры -http://en.wikipedia.org/wiki/Slowly_changing_dimension).

Предположим, у вас есть таблица сообщений, таблица тегов и таблица post2tag:

posts (
 id
)

tags (
 id
)

post2tag (
 post_id fkey posts(id),
 tag_id fkey tags(id)
)

Мне нужна пара вещей:

Возможность точно показать, как выглядело сообщение в произвольный момент времени, в том числе для удаленных строк.Следите за тем, кто что редактирует, для полного аудита.Требуется набор материализованных представлений («живых» таблиц) для сохранения ссылочной целостности (т. Е. Регистрация должна быть прозрачной для разработчиков).Должен быть соответственно быстрым для жизниа также последние черновики строк.Возможность иметь черновик поста вместе с живым постом.

Я изучал различные варианты. Пока что лучшее, что я придумал (без точек # 4 / # 5), немного похоже на гибридную установку типа 6 SCD, но вместо текущего логического значения есть материализованное представление для текущей строки. Для всех намерений и целей это выглядит так:

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 для поддержания индексов по периоду (создал_, удален_). И я синхронизирую различные таблицы с помощью триггеров. Яда, яда, яда ... Я создал триггеры, которые позволяют отменить редактирование сообщений / тегов таким образом, чтобы черновик сохранялся в оборотах без публикации. Это прекрасно работает.

Кроме когда мне нужно беспокоиться о связях, связанных с черновиками, на post2tag. В этом случае весь ад вырвется на свободу, и это намекает мне на то, что у меня там какая-то проблема с дизайном. Но у меня заканчиваются идеи ...

Я подумал о введении дублирования данных (то есть n строк post2tag, представленных для каждой черновой версии). Этот вид работает, но, как правило, работает намного медленнее, чем хотелось бы.

Я подумал о введении таблиц черновиков для «последнего черновика», но это быстро становится очень и очень уродливым.

Я рассмотрел все виды флагов ...

Итак, вопрос: есть ли общепринятые способы управления живыми и неживыми строками в среде с управлением версиями строк? А если нет, то что вы пробовали и были достаточно успешны?

Ответы на вопрос(5)

Ваш ответ на вопрос