2016-10-29 12 views
0

У меня есть приложение WinForm (C#) и поддерживается как SQL Server 2008, работающее в автономном режиме в месте расположения клиента. В настоящее время все филиалы управляются из одного места, поэтому значение столбца идентификатора всегда уникально для разных ветвей.Создание уникального значения столбца идентификатора в разных экземплярах SQL Server

Теперь я хочу, чтобы это приложение управлялось из нескольких мест и должно работать как в автономном режиме, так и в режиме онлайн. Чтобы сделать возможным, мы помещаем SQL Server в PUBLIC IP, и каждая ветка будет иметь отдельный локальный экземпляр SQL Server. Данные будут синхронизироваться между локальным и центральным терминалами через регулярные интервалы.

Этот подход подходит для синхронизации данных или есть что-то лучшее, что я могу сделать?

Если я пойду с подходом выше, проблема, с которой я столкнусь, заключается в синхронизации данных. Существует проблема с структурой таблицы, например. У меня есть таблица КУРСЫ следующим образом:

COURSES (COURSE_ID (identity column), COURSE_NAME, COURSE_BRANCH_ID) 

где

  1. COURSE_ID является столбцом идентификаторов
  2. COURSE_NAME представляет имя стандарта
  3. COURSE_BRANCH_ID представляет ветвь, где берется курс.

Теперь каждый SQL Server генерирует собственное значение для столбца COURSE_ID и может быть одинаковым для разных серверов.

  1. Уникальная комбинация COURSE_ID и COURSE_BRANCH_ID.
  2. Есть ли способ добавить COURSE_BRANCH_ID с COURSE_ID без добавления нового столбца IDENTITY?

подхода я думал

  1. Remove идентичности из COURSE_ID колонны,
  2. Добавить новый столбец говорить ID, который будет представлять собой столбец идентификаторов.
  3. Теперь после вставки на столе КУРСЫ написать триггер, который будет обновлять значение COURSE_ID в Concate(COURSE_BRANCH_ID,ID)
convert(number(convert(varchar,COURSE_BRANCH_ID) + convert(varchar,ID)) 

Но это потребует много усилий, как у меня есть около 19 столов с такой проблемой. Я там что-нибудь лучше, чем это мы можем сделать? Любые предложения приветствуются! Спасибо!

ответ

2

Существует несколько подходов, связанных с этой проблемой. Тот, который вы упомянули, где вы объединяете идентификатор ветки в поле идентификации.

Вы можете использовать GUID, вероятность столкновения почти равна нулю. Или вы можете установить Семестр и Приращение Идентификации, чтобы каждая ветвь имела другое начальное значение и все увеличивалось на количество ветвей.

Например, если у вас есть четыре ветви, а затем на branch1 вы можете установить

ID INT IDENTITY(1, 4) NOT NULL -- IDs will be 1, 5, 9...etc. 

На branch2

ID INT IDENTITY(2, 4) NOT NULL -- IDs will be 2, 6, 10 ...etc 

На Branch3

ID INT IDENTITY(3, 4) NOT NULL -- IDs will be 3, 7, 11 ...etc 

И Branch4

ID INT IDENTITY(4, 4) NOT NULL -- IDs will be 4, 8, 12 ...etc.