我不是 SQL 方面的专家,所以我需要社区的帮助。
我有以下简化表格。
CREATE TABLE "Keyspace" (
"id" SERIAL NOT NULL,
"tenantId" INTEGER NOT NULL,
"name" TEXT NOT NULL,
CONSTRAINT "Keyspace_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "Project" (
"id" SERIAL NOT NULL,
"tenantId" INTEGER NOT NULL,
"name" TEXT NOT NULL,
"keyspaceId" INTEGER NOT NULL,
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "Entry" (
"id" SERIAL NOT NULL,
"tenantId" INTEGER NOT NULL,
"projectId" INTEGER NOT NULL,
CONSTRAINT "Entry_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "KeyspaceEntry" (
"keyspaceId" INTEGER NOT NULL,
"entryId" INTEGER NOT NULL,
"number" INTEGER NOT NULL
);
一Entry
只能是一Keyspace
。这是通过Entry
-> Project
->Keyspace
引用强制执行的。
一个Keyspace
会有很多Entries
。
重要的字段是KeyspaceEntry.number
. 这是同一密钥空间中每个条目的自动递增编号。
例子:
- “Keyspace #1”有 3 个条目,其中包含数字
1
,2
,3
- “Keyspace #2”有 2 个带数字的条目
1
,2
- 当您在“Project X”中创建引用“Keyspace #1”的新条目时,应使用
number=4
.
我需要number
在同一事务中实现 Entry 和 KeyspaceEntry 的原子插入并递增。
注意:可能看起来没有必要拥有 KeyspaceEntry 表,因为您可以简单地将number
属性添加到 Entry,但这是一个简化的模型。当条目移动到不同键空间下的不同项目时,我希望拥有所有键空间-条目关系的历史记录。
另一种选择是创建历史表但保留实际Entry.number
属性。它可能更适合查询条目(它将用于通过 KeyspaceID+EntryNumber 选择单个条目),我稍后也可能会考虑这一点。如果您对此设计变更有意见,请分享。
我正在使用 PostgreSQL 16