Объединение данных из нескольких удаленных баз данных SQL в одну главную базу данных SQL - PullRequest
2 голосов
/ 07 сентября 2010

Что ж, я уверен, что этот вопрос уже задавался, но я еще не нашел ни одного надежного ответа на него. Я нахожусь в процессе создания решения, которое включает удаленные офисы, загружающие данные в одну главную базу данных через веб-сервис. По сути, в каждом офисе будет служба Windows, которая работает примерно каждые 1 час, собирает все новые данные в набор данных, подключается к серверу по протоколу http и загружает набор данных. Затем сервер импортирует данные, и все хорошо. По идее это должно работать. Право.

Не совсем, поэтому каждый офис имеет уникальный OfficeID, который ему присваивается сервером, чтобы сохранять их уникальностью на сервере. Сначала я думал, что взломал его, пока не понял проблему с автоматическим инкрементом PK. Видите ли, все удаленные офисы уже имеют существующие данные, и все их таблицы имеют автоматическое увеличение PK и все связанные ограничения. Корневые / родительские таблицы, имеющие OfficeID, не имеют проблем, поскольку они уже уникальны, проблема связана с внешними ключами, поскольку, когда они достигнут сервера, у них будет NewID, и поэтому связь с дочерним элементом будет потеряна.

На данный момент у меня есть только 2 решения.

  1. Удалите все автоинкрементные и уникальные ограничения PK на БД сервера и используйте OfficeID для фильтрации дублированных внешних «ключей». или ...
  2. При импорте набора данных отслеживайте каждую строку и связанный с ней родительский элемент, используя такие вещи, как Scope_Identity и т. Д., Чтобы каждая дочерняя строка была связана с правильной родительской строкой.

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

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

Спасибо John

Ответы [ 4 ]

2 голосов
/ 07 сентября 2010

Используйте GUID в качестве ваших первичных ключей.Это не на 100% надежно (99. и довольно большое количество девяток процентов), и есть снижение производительности, но это самый простой способ сделать это, оставаясь в здравом уме.

1 голос
/ 07 сентября 2010

Можете ли вы включить идентификатор Office в таблицу и иметь составной первичный ключ? Если нет, то я, вероятно, согласился бы с предложением @tdammers использовать GUID.

0 голосов
/ 10 июня 2015

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

Но учтите, что вам НЕ НУЖНО ИЗМЕНИТЬ структуру базы данных «источник», если вы можете добавить идентификатор Office в качестве части метода передачи данных. Просто добавьте идентификатор офиса к каждой таблице в «центральной» базе данных и включите его в первичный ключ (избавляясь от определения автоинкремента / идентификатора из схемы «источника») и пометьте каждую запись идентификатором офиса по мере ее передачи. Этот подход мы используем в sql-hub и применяются в большинстве RDMS (MySQL, MS SQL и т. Д.).

ВАЖНО, хотя любые объединения и т. Д., Выполняемые в «центральной» базе данных, необходимо будет изменить, чтобы добавить в идентификатор Office, иначе вы получите ошибочные и нежелательные CROSS JOINS .

0 голосов
/ 07 сентября 2010

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

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