Int Автоинкрементный первичный ключ и столбец GUID - PullRequest
0 голосов
/ 19 июля 2011

У меня есть база данных, в которой большинство таблиц имеют первичные ключи int (автоинкремент).

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

Поскольку первичный ключ является автоинкрементным ключом, я знаю, что существует проблема столкновения первичного ключа.

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

, а затем создайте пользовательскую синхронизирующую логику для поиска этого GUID / сравнивающего клиента

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

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Вы должны посмотреть на репликацию. Я не знаю, поможет ли это в вашем случае или нет. Но репликация обычно настраивается с помощью GUID.

0 голосов
/ 25 июля 2011

Вообще говоря, автоинкрементная клавиша не будет сталкиваться; на самом деле, я не уверен, как это сделать (поскольку большинство определений в SQL включают ограничение Unique). Однако вы можете получить duplicate key ошибок. Почему вы позволяете внешним поставщикам определять, какие у вас внутренние ключи? Примите законченную запись от них и сгенерируйте ключи самостоятельно. Если у вас заканчиваются ключи, увеличьте размер столбца (до длинного). Да, вы можете создать новый столбец GUID, но, скорее всего, вы все равно будете генерировать GUID, так в чем же разница?

Часто большинство таблиц в базе данных имеют более одного «уникального» ключа. Это «естественные» ключи - фактические столбцы, которые составляют уникальный набор данных; к сожалению, это может в конечном итоге составить всю ширину таблицы (именно поэтому используются id столбцы). Кроме того, если не существует какого-то странного варианта использования, не сообщайте серверу об идентификаторах клиента - информируйте клиентов об идентификаторах сервера и отслеживайте их в отдельном столбце (при необходимости) на клиенте. Затем может иметь свои собственные внутренние идентификаторы, которые они используют перед загрузкой, которые не имеют отношения к ключам, которые вы возвращаете, и которые они никогда не передают на сервер.

Не имеет значения, какой у сервера идентификатор (int или GUID), хотя я бы рекомендовал придерживаться того, что у вас есть. Всякий раз, когда клиент дает вам строку для размещения на сервере, возвращайте ему сгенерированный идентификатор с сервера. Это препятствует тому, чтобы клиенты пытались вставить уже используемые идентификаторы, и связанные с этим проблемы (откуда вы знаете, что полученный вами идентификатор не должен был быть сгенерирован каким-либо другим устройством?). Я бы сказал, что клиенты не могут диктовать внутренние идентификаторы на сервере


EDIT:

В свете некоторых быстрых исследований репликации (в ответ на HLGEM) и перечитывания исходного вопроса; Первоначально я принял этот вопрос как вопрос о том, чтобы позволить клиентам диктовать внутренние первичные ключи (что все еще плохо) и / или заменить первичные ключи int на GUID. Хотя ваши точные потребности могут не потребоваться, добавление дополнительного столбца GUID, который может заполнить клиент, будет работать. Некоторые рекомендации:
1) Рассматривать нарушения уникального ключа (случайные или злонамеренные) в столбце GUID как исключение business , а не как исключение system . Я бы, вероятно, рекомендовал сообщить клиенту, что нужно заново сгенерировать GUID и повторно отправить (без вывода сообщений). 2) Клиент никогда не может определять точные значения столбцов первичного ключа в базе данных. Фактически, если вы используете столбец GUID, клиенту может даже не понадобиться знать о них.

...