2013-09-23 2 views
1

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

До сих пор я был только с помощью:

CREATE TABLE WorkItems 
(
    Id SERIAL NOT NULL PRIMARY KEY, 
    ... 
); 

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

Так что я хочу для пользователей, чтобы увидеть последовательные дружественных Идентификаторы

 
User1: ids = 1, 2, 3 etc.. 
User2: ids = 1, 2, 3, 4, 5 etc.. 

и не приходится иметь дело с уникальными идентификаторами, но эти элементы будут иметь уникальные идентификаторы 1-8.

Я немного огляделся и не могу найти сообщений по этой теме. Может быть, это просто сложно указать и искать?

Должен ли я хранить LastWorkIdUsed в столбце пользователя, а затем просто вручную создавать дружественный идентификатор для своих элементов? Похоже, что мне необязательно беспокоиться о параллелизме и транзакциях. Есть ли простой способ передать LastWorkIdUsed для каждого пользователя Postgresql при генерации числа?

Или есть способ назначить последовательность пользователю?

Возможно, у меня фундаментальная идея дизайна неправильная. Как это сделать в SQLServer или MySQL?

+0

Вы должны выполнить ЗЕЬЕСТ для получения значения MAX в WorkItem Пользователь WHERE является указанным пользователем. Затем добавьте 1 к нему, и это станет вашим новым номером пользователя/рабочего номера. –

+2

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

+1

@RobertHarvey: Вы забыли обо всех записях за столами, которые необходимы для того, чтобы этот подход работал. Если никогда не будет более одного соединения с базой данных за раз, поэтому вам не придется беспокоиться о гоночных условиях. –

ответ

2

Вы сказали, что у вас также имеют уникальный по всему миру ключ. Вы можете использовать это для решения проблем с параллелизмом. Если вы разрешите номер рабочего элемента пользователя равным нулю, вы можете сначала создать рабочий элемент, а затем сделать что-то подобное, чтобы присвоить ему «дружественный» номер. (T-SQL диалект, @workItemID является глобально уникальным идентификатором):

Update wi 
set friendlyNumber = coalesce(
    (select max(friendlyNumber)+1 from WorkItem wi2 
    where wi2.userID = wi.userID and not wi2.friendlyNumber is null) 
, 1) 
From WorkItem wi 
where workItemID = @workItemID and friendlyNumber is null 

Затем выяснить число так:

select friendlyNumber from WorkItem where workItemID = @workItemID 
Смежные вопросы