Мой оригинальный вопрос можно найти здесь , на который я получил несколько отличных ответов, идей и советов.
В рамках исследования осуществимости и производительности я начал преобразовывать свои схемы для того, чтобы версионировать свои данные, используя эти идеи. При этом у меня возникла какая-то другая проблема.
В моем первоначальном вопросе мой пример был прост, без реальных реляционных ссылок. В попытке сохранить пример моего предыдущего вопроса я теперь расширю часть «Имя» на другую таблицу.
Итак, теперь мои данные становятся:
Person
------------------------------------------------
ID UINT NOT NULL,
NameID UINT NOT NULL,
DOB DATE NOT NULL,
Email VARCHAR(100) NOT NULL
PersonAudit
------------------------------------------------
ID UINT NOT NULL,
NameID UINT NOT NULL,
DOB DATE NOT NULL,
Email VARCHAR(100) NOT NULL,
UserID UINT NOT NULL, -- Who
PersonID UINT NOT NULL, -- What
AffectedOn DATE NOT NULL, -- When
Comment VARCHAR(500) NOT NULL -- Why
Name
------------------------------------------------
ID UINT NOT NULL,
FirstName VARCHAR(200) NOT NULL,
LastName VARCHAR(200) NOT NULL,
NickName VARCHAR(200) NOT NULL
NameAudit
------------------------------------------------
ID UINT NOT NULL,
FirstName VARCHAR(200) NOT NULL,
LastName VARCHAR(200) NOT NULL,
NickName VARCHAR(200) NOT NULL,
UserID UINT NOT NULL, -- Who
NameID UINT NOT NULL, -- What
AffectedOn DATE NOT NULL, -- When
Comment VARCHAR(500) NOT NULL -- Why
В графическом интерфейсе мы могли видеть следующую форму:
ID : 89213483
First Name : Firsty
Last Name : Lasty
Nick Name : Nicky
Date of Birth : January 20th, 2005
Email Address : my.email@host.com
Можно изменить:
- Только для части 'name'
- Только для части "человек"
- Как для имени, так и для личности
Если возникает «1», мы копируем исходную запись в NameAudit и обновляем нашу запись Name с изменениями. Поскольку ссылка на имя человека остается прежней, никаких изменений в Person или PersonAudit не требуется.
Если происходит «2», мы копируем исходную запись в PersonAudit и обновляем запись Person с изменениями. Поскольку часть имени не изменилась, никаких изменений в Name или NameAudit не требуется.
Если появляется «3», мы обновляем нашу базу данных в соответствии с двумя методами выше.
Если мы должны были внести 100 изменений как в части имени, так и в часть имени, одна проблема возникает, когда вы позже попытаетесь показать историю изменений. Все мои изменения показывают человека, имеющего последнюю версию имени. Что, очевидно, неправильно.
Чтобы исправить это, может показаться, что поле NameID в Person должно ссылаться на NameAudit (но только если в Name есть изменения).
И именно эта условная логика начинает усложнять вещи.
Мне было бы любопытно узнать, сталкивался ли кто-нибудь с подобными проблемами с их базой данных и какое решение было применено?