Ведение исторических изменений данных в таблице «родитель-потомок» - PullRequest
0 голосов
/ 28 ноября 2018

1 Сотрудник имеет N Адрес.Здесь мне нужно сохранить историческую информацию об изменениях Сотрудника и Адреса, если какие-либо изменения были внесены любыми пользователями в этих двух таблицах.

Таблица Сотрудник:

Employee(
EmpID BIGINT PRIMARY KEY IDENTITY(1,1),
Name varchar(200),
EmpNumber varchar(200),
Createddate Datetime2)

Адрес Таблица:

Address(
AddID BIGINT PRIMARY KEY IDENTITY(1,1),
AddressLine1 varchar(300),
AddressLine2 varchar(300),
EmpID BIGINT NULL,
AddressType varchar(100),
Createddate Datetime2)

Выше EmpID - это внешний ключ к таблице Employee

Сценарий, который я должен выполнить:

  1. Я должен иметь возможность отслеживать изменения отдельного адреса(Записи дочерней таблицы) записи любого сотрудника.
  2. Я должен иметь возможность отслеживать изменения сотрудника (записи родительской таблицы) с помощью записи адреса ребенка.

Я думалследующим образом: предположим, что изначально он находится в состоянии, показанном на изображении ниже enter image description here

Решение 1:

Случай: когда дочерняя таблица обновляется сейчас, я обновляюзапись адреса Add0001, поэтому я вставляю новую запись в таблицу адресов, делая предыдущую запись неактивной: enter image description here

Случай: когда обновляется родительская таблица сейчас, когда обновляется родительская таблица,У меня есть история таблe для родительской таблицы, и я перемещаю старые данные в таблицу истории и обновляю текущие записи в родительскую таблицу, как показано: enter image description here

Решение 2:

Случай: когда обновляется дочерняя таблица То же, что и в решении 1

Случай: когда обновляется родительская таблица

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

enter image description here

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

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Можете ли вы использовать Временные таблицы и таблицы истории , представленные в SQL Server 2016?

Они позволяют специалистам по данным сохранять историю данных в связанной таблице, поэтому вам не нужнодумать о родителе или ребенке и т. д.

0 голосов
/ 28 ноября 2018

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

До изменений в родительском файле

Теперь, если вы измените имя сотрудника и добавите новый адрес, обновите идентификатор сотрудника в дочерней таблице (Адрес).

После изменений в родительском элементе

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

Любые предложения приветствуются.

0 голосов
/ 28 ноября 2018

Существует довольно много способов сделать что-то подобное, и то, что вы предлагаете, является совершенно обоснованным подходом ... По крайней мере, вы, кажется, направлены в правильном направлении.

Естьпара изменений, которые я бы предложил ...

1) Избавьтесь от флага "status" и используйте даты "begin" и "end".Конкретные имена не имеют значения, если они у вас есть.

2) Столбцы даты начала и окончания должны быть определены как "NOT NULL", а начало должно иметь ограничение по умолчанию GETDATE () или CURRENT_TIMESTAMP.,Дата окончания должна быть установлена ​​по умолчанию на «99991231». Доверяйте мне и сражайтесь с желанием сделать дату окончания NULLable и дать "активным" строкам NULL даты окончания. '99991231' для всех практических целей конец времени.и может использоваться для простой идентификации текущих активных строк.

3) Я бы предложил добавить триггер к следующему:

  • a) предотвратить обновления и / или удаления.В идеале это будет таблица только для вставки.
  • b) Когда вставляются новые строки, обновите (да, я знаю, что говорит "a)" дата окончания "существующих текущих" строк с датой начала "новых текущих" строк,Делая это, вы получите непрерывную историю без пробелов.

Надеюсь, это поможет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...