feat(db): ads 写权威表与 ads_ov 投影表(含迁移)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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 恒为权威快照值(非增量)。
|
||||
|
||||
Reference in New Issue
Block a user