3

ユーザーの作業項目を保持するために postgresql にテーブルを作成しようとしています。各作業項目はシステム全体で一意の ID を持ちますが、その特定のユーザーのわかりやすい連続 ID も持ちます。

これまでのところ、私はちょうど使用しています:

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

しかし、このシリアルをユーザーごとに区分する方法も、シーケンスでそれを行う方法もわかりません。

だから私はユーザーが連続したFriendly Idを見てほしい

ユーザー 1: ID = 1、2、3 など。
ユーザー 2: ID = 1、2、3、4、5 など。

一意の ID を処理する必要はありませんが、これらのアイテムには 1 ~ 8 の一意の ID があります。

私はかなり見回しましたが、このトピックに関する投稿は見つかりません。たぶん、指定して検索するのが難しいだけですか?

LastWorkIdUsed をユーザー列に保存してから、アイテムのフレンドリ ID を手動で作成する必要がありますか? その場合、並行性とトランザクションについて不必要に心配する必要があるようです。数値を生成するときに、ユーザーごとに LastWorkIdUsed を Postgresql に渡す簡単な方法はありますか?

または、シーケンスをユーザーに割り当てる方法はありますか?

おそらく、基本的な設計思想が間違っているのでしょう。SQLServerまたはMySQLでもこれを行うにはどうすればよいですか?

4

2 に答える 2

2

グローバルに一意のキー持っているとおっしゃいました。これを使用して、同時実行の問題を解決できます。ユーザーの作業項目番号を null にすることを許可する場合は、最初に作業項目を作成してから、次のような操作を行って "わかりやすい" 番号を割り当てることができます。(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 に答える