feat(db): ads 写权威表与 ads_ov 投影表(含迁移)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-28 22:43:25 +08:00
parent 001d3aaf73
commit 726f6a1be8
4 changed files with 75 additions and 0 deletions
@@ -0,0 +1,22 @@
-- 广告位域(2026-09-28 设计 §2.1):ads 写权威表。
-- 校对手决:Prisma 生成 DDL 固定 utf8mb4_unicode_ci,逐表改写为库级约定的
-- utf8mb4_0900_bin(同 embed_slots 口径)。albumIds JSON null=全局(归一化:
-- 空数组存 null);绑定相册删除不级联清理(观众页已 404,后台编辑过滤失效项)。
-- 排序索引(sortOrder, createdAt)服务公开端列表序。
-- CreateTable
CREATE TABLE `ads` (
`id` VARCHAR(191) NOT NULL,
`title` VARCHAR(120) NULL,
`imageObjectKey` VARCHAR(512) NOT NULL,
`linkUrl` VARCHAR(2048) NOT NULL,
`enabled` BOOLEAN NOT NULL DEFAULT true,
`sortOrder` INTEGER NOT NULL DEFAULT 0,
`albumIds` JSON NULL,
`entityVersion` INTEGER NOT NULL DEFAULT 1,
`createdAt` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` DATETIME(6) NOT NULL,
INDEX `ads_sortOrder_createdAt_idx`(`sortOrder`, `createdAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
+17
View File
@@ -364,3 +364,20 @@ model embed_slot_members {
@@unique([slotId, userId])
@@index([userId])
}
// —— 广告位域(2026-09-28 设计 §2.1):全局/定向投放,写权威 ——
// albumIds null=全局(归一化:空数组存 null);绑定相册删除不级联清理
// (该相册观众页已 404,后台编辑过滤失效项——设计 §2.1 登记)。
model ads {
id String @id @default(cuid())
title String? @db.VarChar(120)
imageObjectKey String @db.VarChar(512)
linkUrl String @db.VarChar(2048)
enabled Boolean @default(true)
sortOrder Int @default(0)
albumIds Json?
entityVersion Int @default(1)
createdAt DateTime @default(now()) @db.DateTime(6)
updatedAt DateTime @updatedAt @db.DateTime(6)
@@index([sortOrder, createdAt])
}
@@ -0,0 +1,21 @@
-- 广告位副本表(cn ads 的展示投影,ad.updated/ad.deleted 事件应用)。
-- 校对手决:Prisma 生成 DDL 固定 utf8mb4_unicode_ci,改写为库级约定的
-- utf8mb4_0900_bin(同 embed_slots_ov 口径)。无墓碑:ad.deleted 墓碑与
-- enabled=false 快照都表达为「删行」(公开不可见);createdAt/updatedAt 为
-- cn 原值(排序 tie-break,非本机生成)。排序索引(sortOrder, createdAt)与
-- cn ads 同构。
-- CreateTable
CREATE TABLE `ads_ov` (
`adId` VARCHAR(32) NOT NULL,
`imageObjectKey` VARCHAR(512) NOT NULL,
`linkUrl` VARCHAR(2048) NOT NULL,
`sortOrder` INTEGER NOT NULL,
`albumIds` JSON NULL,
`entityVersion` INTEGER NOT NULL,
`createdAt` DATETIME(6) NOT NULL,
`updatedAt` DATETIME(6) NOT NULL,
INDEX `ads_ov_sortOrder_createdAt_idx`(`sortOrder`, `createdAt`),
PRIMARY KEY (`adId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
+15
View File
@@ -183,6 +183,21 @@ model embed_slots_ov {
updatedAt DateTime @updatedAt @db.DateTime(6)
}
// —— 副本域:ads_ov(cn ads 的展示投影,2026-09-28)——
// 无墓碑——ad.deleted 墓碑与 enabled=false 快照都表达为「删行」(公开不可见);
// createdAt 为 cn 原值(排序 tie-break,非本机生成)。
model ads_ov {
adId String @id @db.VarChar(32)
imageObjectKey String @db.VarChar(512)
linkUrl String @db.VarChar(2048)
sortOrder Int
albumIds Json?
entityVersion Int
createdAt DateTime @db.DateTime(6)
updatedAt DateTime @db.DateTime(6)
@@index([sortOrder, createdAt])
}
// —— 统计回传队列:outbox_stat_events(ov→cn,Task 9 消费)——
// 与 cn outbox_events 同构的发送位:sentAt 为空即重发(中断恢复),statVersion
// 让 cn 侧「仅更高版本替换」幂等。total 恒为权威快照值(非增量)。