diff --git a/backend/services/mining-admin-service/prisma/migrations/20260113000000_remove_cdc_foreign_keys/migration.sql b/backend/services/mining-admin-service/prisma/migrations/20260113000000_remove_cdc_foreign_keys/migration.sql new file mode 100644 index 00000000..209cce74 --- /dev/null +++ b/backend/services/mining-admin-service/prisma/migrations/20260113000000_remove_cdc_foreign_keys/migration.sql @@ -0,0 +1,21 @@ +-- ============================================================================= +-- 移除 CDC 同步表的外键约束 +-- 原因:CDC 事件异步到达,顺序不可控,子表记录可能在父表记录之前到达 +-- 参考:https://estuary.dev/blog/cdc-done-correctly/ +-- ============================================================================= + +-- 移除 synced_contribution_accounts 表的外键约束 +ALTER TABLE "synced_contribution_accounts" +DROP CONSTRAINT IF EXISTS "synced_contribution_accounts_accountSequence_fkey"; + +-- 移除 synced_referrals 表的外键约束 +ALTER TABLE "synced_referrals" +DROP CONSTRAINT IF EXISTS "synced_referrals_accountSequence_fkey"; + +-- 移除 synced_mining_accounts 表的外键约束 +ALTER TABLE "synced_mining_accounts" +DROP CONSTRAINT IF EXISTS "synced_mining_accounts_accountSequence_fkey"; + +-- 移除 synced_trading_accounts 表的外键约束 +ALTER TABLE "synced_trading_accounts" +DROP CONSTRAINT IF EXISTS "synced_trading_accounts_accountSequence_fkey"; diff --git a/backend/services/mining-admin-service/prisma/schema.prisma b/backend/services/mining-admin-service/prisma/schema.prisma index 563ed3de..d0c0a3fe 100644 --- a/backend/services/mining-admin-service/prisma/schema.prisma +++ b/backend/services/mining-admin-service/prisma/schema.prisma @@ -163,11 +163,8 @@ model SyncedUser { syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt - // 关联同步表 - contributionAccount SyncedContributionAccount? - miningAccount SyncedMiningAccount? - tradingAccount SyncedTradingAccount? - referral SyncedReferral? + // CDC 同步表不设置外键约束,因为事件到达顺序不可控 + // 使用 accountSequence 作为逻辑关联键,查询时用 LEFT JOIN @@index([phone]) @@index([status]) @@ -182,7 +179,7 @@ model SyncedUser { model SyncedContributionAccount { id String @id @default(uuid()) - accountSequence String @unique + accountSequence String @unique // 逻辑关联 SyncedUser.accountSequence,无外键约束 personalContribution Decimal @db.Decimal(30, 8) @default(0) teamLevelContribution Decimal @db.Decimal(30, 8) @default(0) teamBonusContribution Decimal @db.Decimal(30, 8) @default(0) @@ -195,8 +192,6 @@ model SyncedContributionAccount { syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt - user SyncedUser @relation(fields: [accountSequence], references: [accountSequence]) - @@map("synced_contribution_accounts") } @@ -206,7 +201,7 @@ model SyncedContributionAccount { model SyncedReferral { id String @id @default(uuid()) - accountSequence String @unique + accountSequence String @unique // 逻辑关联 SyncedUser.accountSequence,无外键约束 referrerAccountSequence String? // 推荐人账户序列号 referrerUserId BigInt? // 1.0 的 referrer_id originalUserId BigInt? // 1.0 的 user_id @@ -215,8 +210,6 @@ model SyncedReferral { syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt - user SyncedUser @relation(fields: [accountSequence], references: [accountSequence]) - @@index([referrerAccountSequence]) @@index([depth]) @@map("synced_referrals") @@ -308,7 +301,7 @@ model SyncedNetworkProgress { model SyncedMiningAccount { id String @id @default(uuid()) - accountSequence String @unique + accountSequence String @unique // 逻辑关联 SyncedUser.accountSequence,无外键约束 totalMined Decimal @db.Decimal(30, 8) @default(0) availableBalance Decimal @db.Decimal(30, 8) @default(0) frozenBalance Decimal @db.Decimal(30, 8) @default(0) @@ -316,8 +309,6 @@ model SyncedMiningAccount { syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt - user SyncedUser @relation(fields: [accountSequence], references: [accountSequence]) - @@map("synced_mining_accounts") } @@ -327,7 +318,7 @@ model SyncedMiningAccount { model SyncedTradingAccount { id String @id @default(uuid()) - accountSequence String @unique + accountSequence String @unique // 逻辑关联 SyncedUser.accountSequence,无外键约束 shareBalance Decimal @db.Decimal(30, 8) @default(0) cashBalance Decimal @db.Decimal(30, 8) @default(0) frozenShares Decimal @db.Decimal(30, 8) @default(0) @@ -337,8 +328,6 @@ model SyncedTradingAccount { syncedAt DateTime @default(now()) updatedAt DateTime @updatedAt - user SyncedUser @relation(fields: [accountSequence], references: [accountSequence]) - @@map("synced_trading_accounts") }