2016-09-14 4 views
0

У нас есть внутреннее программное обеспечение на основе базы данных SQL-сервера с главной таблицей и несколькими связанными таблицами. Характер данных, которые мы храним, довольно сложно описать, но предположим, что у нас есть таблица клиентов с некоторыми объединенными таблицами: заказы, отгрузки, телефонные журналы, жалобы и т. Д.Таблицы SQL-мастер-SQL - лучше UPDATE или DELETE + INSERT?

Нам необходимо синхронизировать это программное обеспечение с внешним который имеет собственную БД (с той же структурой) и создает XML-файл с обновленной информацией о наших «клиентах» (по одному файлу на одного клиента). Обновления могут быть в главной таблице и/или от 0 до n соединенные таблицы.

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

Для этого потребуется много кодирования.

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

Это было бы не так эффективно.

Обратите внимание, что в основной таблице имеется 13 полей, а также около 6 таблиц с 3 по 15 полей.

В этом приложении мы в основном используем LINQ.

Как вы продолжите?

PS: Я заметил несколько ответов на эту тему здесь, в StackOverflow, но почти все относятся к одиночным таблицам (одиночные строки).

ответ

0

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

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

Для экспорта:

Это может сделать легко запрашивать только те строки, ожидающие быть iserted, обновлены или удалены, и игнорировать строки в актуальном состоянии.

Для импорта:

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

+0

Спасибо, Джин, за ваш ответ. Данные никогда не экспортируются из нашего приложения. Наше приложение в основном доступно только для чтения, данные периодически обновляются сторонним приложением (через xml). И, конечно, каждый XML-файл содержит все данные об одном клиенте (оба данных, которые у меня уже есть в моем db и данные, которые мне нужно добавить/отредактировать/удалить). Итак, каждый раз, когда приходит файл, я не могу сказать, что мне нужно обновить, если я не сравниваю каждую строку. Мне непонятно, как я могу использовать флаги для обработки всего этого. – Disti

+0

Флаги полезны только для экспорта (стыдно, что другая система не может сказать вам, что обновляется, вставлена, удалена) и для логического удаления. Только для импорта вы можете создать «внешний идентификатор», и если в таблице большое значение также используется столбец хэша, чтобы узнать, есть ли вообще обновление. Вы даже можете хэш-код файла XML, чтобы проверить, есть ли какие-либо изменения в файле по сравнению с предыдущей версией – jean

0

Идея (учитывая, что вы делаете это на стороне сервера базы данных):

  • Построить таблицы из XML-клиента. Это может быть временная таблица или таблица с памятью.
  • Создание запросов SELECT для поиска новых, обновленных, удаленных данных.Эти запросы выбора присоединятся к таблицам в вашей базе данных и таблице, построенной из клиента xml. Результат соединения будет определять, есть ли у вас новые записи, обновленные записи, удаленные записи или их сочетание.
  • Запуск вставки, обновление, удаление соответственно.
Смежные вопросы