SQL 2005/2008 Изменение поля отслеживания базы данных - PullRequest
0 голосов
/ 27 января 2011

Я не хочу аудит или отслеживание истории.

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

С макушки головы я могу придумать 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

.

Ответы [ 2 ]

1 голос
/ 27 января 2011

Есть две проблемы, о которых я могу подумать, если вы выберете вариант 1.

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

Другая проблема - моделирование полей в вашей таблице, которые могут быть NULL. Если вы используете NULL для представления поля, не изменилось, как вы можете представить поле, изменяющееся на NULL?

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

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

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

Я нашел отличную статью: Самый короткий, быстрый и простой способ сравнения двух таблиц в SQL Server: UNION! , описывающий такое сравнение.

0 голосов
/ 27 января 2011

Подумайте о наличии триггера обновления, который обновляет поле updatedBy.У нас есть пользователь для нашего импорта, который не разрешено использовать другим процессам, который обновляет поле, если они были выполнены при импорте.Таким образом, если последним обновляется какое-либо значение, кроме пользователя -1, вы можете легко определить.Затем вы можете использовать объединение для вставки / удаления / обновления.

...