Я не хочу аудит или отслеживание истории.
У меня есть приложение, которое извлекает данные из внешнего источника.
Мы отражаем внешние таблицы в нашей собственной БД. Мы разрешаем нашим пользователям обновлять данные в нашей БД.
В следующий раз, когда система синхронизируется с внешними данными, мы переопределяем только те поля, которые мы не изменили локально.
С макушки головы я могу придумать 2 способа сделать это
1) Хранить 2 строки для каждого объекта. Первая 1 - это внешняя версия, вторая строка ссылается на внешнюю версию, но в поле будут только данные, если это поле было изменено.
например,
id | parentId | field1 | field2
1 | null | foo | bar
2 | 1 | new foo | null
Это иллюстрирует, как будут выглядеть данные, когда локальный пользователь изменил field1.
Если не произойдет никаких изменений, будет только первая строка.
2) Удвойте количество столбцов в таблице.
например
name_external
name_internal
Мне больше нравится вариант 1, так как кажется, что он обеспечивает лучшее разделение, упрощает запрос и сравнение кодов между двумя объектами. Единственным недостатком является то, что это приведет к большему количеству строк, но БД будет довольно маленькой.
Могу ли я использовать другие шаблоны? Или причина, по которой я не должен идти с вариантом 1.
Я буду использовать службы .NET 4 WCF
Решение
Я пойду с ответом из двух таблиц, приведенным ниже. и используйте следующий SQL для возврата строки, в которой поля, которые были изменены локально, объединены с оригинальными значениями
SELECT
a.[ID],
isnull(b.[firstName], a.[firstName]),
isnull(b.[lastName], a.[lastName]),
isnull(b.[dob], a.[dob]),
isnull(b.active, a.active)
From tbl1 a
left join tbl2 b on a.[ID] = b.[ID]
Как и в моем случае, БД сможет обновляться только через систему пользовательского интерфейса. И я могу гарантировать, что людям не разрешено вводить NULL в качестве значения, вместо этого я заставляю их вводить пустую строку. Это позволит мне решить проблему, которая произойдет, если пользователь обновит значение до NULL
.