3

我正在尝试在 postgresql 中创建一个表来保存用户工作项。每个工作项在整个系统中都有一个唯一的 ID,但对于该特定用户也将有一个友好的顺序 ID。

到目前为止,我一直在使用:

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

但我不知道如何为每个用户划分这个序列,也不知道如何用序列来做到这一点。

所以我想让用户看到连续的友好 ID

用户 1:ids = 1、2、3 等。
用户 2:ids = 1、2、3、4、5 等。

并且不必处理唯一 ID,但这些项目将具有 1-8 的唯一 ID。

我环顾四周,找不到有关此主题的任何帖子。也许很难指定和搜索?

我是否应该将 LastWorkIdUsed 存储在用户列中,然后为他们的项目手动创建一个友好的 ID?似乎我不必担心并发和事务。生成数字时,是否有一种简单的方法可以将每个用户的 LastWorkIdUsed 传递给 Postgresql?

或者有没有办法给用户分配一个序列?

也许我的基本设计理念是错误的。在 SQLServer 或 MySQL 中如何做到这一点?

4

2 回答 2

2

你说你有一个全球唯一的钥匙。您可以使用它来解决并发问题。如果您允许用户工作项编号为空,您可以先创建工作项,然后执行类似的操作为其分配一个“友好”编号。(T-SQL 方言,@workItemID 是全局唯一ID):

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
于 2013-09-23T16:08:22.877 回答
-1

我觉得这是“我想要月亮”的要求。

如果您能解释为什么需要这种 ID,那么在为您寻找解决方案时,它与我们的关系会更大。

在我看来,您想要了解用户所做的工作。

我的解决方案:您是否可能犯了设计错误?

  • 工作项(id_workitem)
  • 用户(id_user)
  • 提交(id_user、id_workitem、committed_on、comment)

所以现在,您只需加入这些表并按committed_on 排序。并将(或不)编号留给您的应用程序。

于 2018-05-21T13:26:31.807 回答