Não sou um grande especialista em SQL, então preciso da ajuda da comunidade.
Eu tenho as seguintes tabelas simplificadas.
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
);
Só se Entry
pode estar em um Keyspace
. Isso é aplicado por Entry
-> Project
-> Keyspace
referência.
Um Keyspace
terá muitos Entries
.
O campo importante é KeyspaceEntry.number
. Este é o número incrementado automaticamente para cada entrada no mesmo Keyspace.
Exemplo:
- "Keyspace #1" tem 3 entradas com números
1
,2
,3
- "Keyspace #2" tem 2 entradas com números
1
,2
- Quando você cria uma nova entrada no "Projeto X" que faz referência ao "Keyspace #1", então KeyspaceEntry deve ser criado com
number=4
.
Preciso implementar a inserção atômica para Entry e KeyspaceEntry com incremento number
na mesma transação.
Nota: Pode parecer desnecessário ter a tabela KeyspaceEntry porque você pode simplesmente adicionar number
propriedades à Entrada, mas este é um modelo simplificado. Quero ter um histórico de todos os relacionamentos Keyspace-Entry para o caso em que uma entrada é movida para um projeto diferente em um keyspace diferente.
Outra opção pode ser criar uma tabela histórica mas mantendo a Entry.number
propriedade real. Pode ser melhor para consultar entradas (será usado para selecionar entradas individuais por KeyspaceID + EntryNumber). Posso considerar isso mais tarde também. Por favor, compartilhe se você tem opinião sobre esta mudança de design.
Estou usando PostgreSQL 16