2013-07-05 2 views
0

Я занимаюсь разработкой системы, в которой хранятся сущности и их отношения с течением времени.Вершина отношений с PHP в базе данных PostgreSQL

Каждый объект имеет свойства, каждое свойство должно быть версией, поэтому, когда свойство объекта изменяется, добавляется новое состояние истории. Сложность связана с тем, что мне также необходимо изменить отношения между отдельными entites. Например: когда объект A перемещается от родителя X к родительскому Y, отношение обоих объектов также получает новое состояние истории.

Я ищу советы о том, как это сделать на более низком уровне - существуют ли какие-либо шаблоны дизайна для такого рода вещей или любые другие передовые методы/проверенные методы?

Я строил это на PHP с помощью базы данных PostgreSQL, опционально используя Doctrine как ORM/DBAL.

+2

Я всегда строил такие вещи с помощью триггеров. Вам нужно очень много думать о проблемах параллелизма, но вам нужно сделать это независимо от того, на каком уровне вы работаете. Часто вам нужно нечетное 'SELECT .. FOR SHARE' на родительском, прежде чем вы поймете вещи о родительских и дочерних объектах. –

+1

Посмотрите здесь: https://github.com/simplethings/EntityAudit – Florian

+1

См .: http://en.wikipedia.org/wiki/Slowly_changing_dimension –

ответ

1

Я бы рекомендовал посмотреть на расширение table_log (https://github.com/psoo/table_log). Это требует компиляции, но оно имеет то преимущество, что позволяет восстанавливать таблицы до предыдущего состояния, изменять ревизию и т. Д.

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

Смежные вопросы