Уникальный идентификатор на нескольких серверах SQL - PullRequest
2 голосов
/ 27 октября 2011

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

Без связи между серверами (они обслуживают только локальные сети), я подумал, что, возможно, генерируется идентификатор из точной отметки временидо миллисекунд может работать.С пулом пользователей, состоящим только из тысяч, а не миллионов, шансы того, что один пользователь будет создан в ту же миллисекунду, что и другой пользователь на другом сервере, довольно низки.

Существует ли действительно какой-либо способ гарантировать уникальный идентификатор на всех серверахбез связи между ними?

Ответы [ 4 ]

5 голосов
/ 27 октября 2011

Да, вы можете сделать это довольно легко, используя автоматически увеличивающиеся идентификаторы, которые увеличиваются на кратное количество серверов, которые у вас есть, но начинаются с другого числа.

Например, если у вас есть 3 базы данных:

Server 1: IDs increment by 3 starting from 1 E.g. 1, 4, 7, 10
Server 2: IDs increment by 3 starting from 2 E.g. 2, 5, 8, 11
Server 3: IDs increment by 3 starting from 3 E.g. 3, 6, 9, 12
5 голосов
/ 27 октября 2011

Используйте 16-байтовый uniqueidentifier тип данных

Примером будет

SELECT NEWID()
GO
-- This will return a new random uniqueidentifier e.g.
E75B92A3-3299-4407-A913-C5CA196B3CAB

Чтобы выбрать этот Guid в переменной

--assign uniqueidentifier in a variable
DECLARE @EmployeeID uniqueidentifier
SET @EmployeeID = NEWID()
You can directly use this with INSERT statement to insert new row in table.

- Вставка данных в таблицу Employees.

INSERT INTO Employees
(EmployeeID, Name, Phone)
VALUES
(NEWID(), 'John Kris', '99-99999')

примеры были из здесь , если вам нужна дополнительная информация

4 голосов
/ 27 октября 2011

Вы пытались использовать тип поля uniqueidentifier (GUID)?

2 голосов
/ 27 октября 2011

UUID (GUID) лучше всего подходит для вашего случая

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