2011-01-27 5 views
0

Я делаю не хочу Аудит или отслеживание истории.SQL 2005/2008 Изменение поля базы данных базы данных

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

Off верхней части моей головы, я могу думать о 2-х способов сделать это

1) хранить 2 строки для каждого объекта. Первая 1 - внешняя версия, вторая строка ссылается на внешнюю версию, но будет иметь только данные в поле, если это поле было изменено. , например.

id  |  parentId | field1  | field2 
1  |  null  |  foo  | bar 
2  |  1  |  new foo | null 

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

2) Двойное количество столбцов в таблице. name_external например name_internal

Мне нравится вариант 1 лучше, как это кажется, что было бы обеспечивает лучшее разделение и проще для запроса и сделать в коде сравнения между 2 объектами. Единственным недостатком является то, что это приведет к большему количеству строк, но БД будет довольно маленьким.

Есть ли другие шаблоны, которые я мог бы использовать? Или почему я не должен идти с вариантом 1.

Я буду использовать .NET 4 WCF службы


Solution

Я пойду с ответом две таблицы, представленной ниже. и использовать следующий SQL, чтобы вернуть строку, которая имеет поле, которые были изменены локально слиты с Orginal значений

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

+0

Сколько полей? Сколько строк? Какая версия SQL? – Hawxby

+0

20 таблиц, от 2 до 20 столбцов на каждой таблице. У каждой таблицы будет от 100 до 5000 строк – Daveo

ответ

1

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

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

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

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

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

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

Я нашел отличную статью: The shortest, fastest, and easiest way to compare two tables in SQL Server: UNION!, описывая такое сравнение.

+0

отличный отклик, вы делаете некоторые очень действительные баллы – Daveo

+0

Думаю, я поеду с опцией 2 стола. Будет очень легко реализовать с использованием EF CodeFirst. Я обновил свой вопрос, чтобы показать SQL, который я буду использовать. – Daveo

0

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

+0

Я могу понять, как это будет работать для всей строки, но не вижу, как это будет работать для каждого столбца senario. – Daveo

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