From ceaece754ec7facb278219246622ae26d1ff9783 Mon Sep 17 00:00:00 2001 From: nav Date: Tue, 12 May 2026 10:21:48 +0000 Subject: [PATCH] feat(guild-model): add practical indexes for channel/dm/member queries --- Fabric.Backend.Guild/src/entities/channel.entity.ts | 3 +++ .../src/entities/dm-conversation.entity.ts | 3 ++- Fabric.Backend.Guild/src/entities/dm-participant.entity.ts | 6 +++++- Fabric.Backend.Guild/src/entities/guild-member.entity.ts | 7 ++++++- Fabric.Backend.Guild/src/entities/message.entity.ts | 3 +++ docs/TODO-backend-center-guild.md | 2 +- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Fabric.Backend.Guild/src/entities/channel.entity.ts b/Fabric.Backend.Guild/src/entities/channel.entity.ts index 03bb5a6..873e9ef 100644 --- a/Fabric.Backend.Guild/src/entities/channel.entity.ts +++ b/Fabric.Backend.Guild/src/entities/channel.entity.ts @@ -1,10 +1,12 @@ import { Column, CreateDateColumn, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity('channels') +@Index(['guildId', 'createdAt']) export class Channel { @PrimaryGeneratedColumn('uuid') id!: string; + @Index() @Column({ type: 'char', length: 36 }) guildId!: string; @@ -22,5 +24,6 @@ export class Channel { lastSeq!: number; @CreateDateColumn() + @Index() createdAt!: Date; } diff --git a/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts b/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts index 611a935..6f9f5a6 100644 --- a/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts +++ b/Fabric.Backend.Guild/src/entities/dm-conversation.entity.ts @@ -1,4 +1,4 @@ -import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, CreateDateColumn, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity('dm_conversations') export class DmConversation { @@ -12,5 +12,6 @@ export class DmConversation { topic!: string | null; @CreateDateColumn() + @Index() createdAt!: Date; } diff --git a/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts b/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts index 0dcc964..e05f11d 100644 --- a/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts +++ b/Fabric.Backend.Guild/src/entities/dm-participant.entity.ts @@ -1,13 +1,16 @@ -import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, CreateDateColumn, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity('dm_participants') +@Index(['conversationId', 'userId'], { unique: true }) export class DmParticipant { @PrimaryGeneratedColumn('uuid') id!: string; + @Index() @Column({ type: 'char', length: 36 }) conversationId!: string; + @Index() @Column({ type: 'varchar', length: 64 }) userId!: string; @@ -15,5 +18,6 @@ export class DmParticipant { role!: 'member'; @CreateDateColumn() + @Index() createdAt!: Date; } diff --git a/Fabric.Backend.Guild/src/entities/guild-member.entity.ts b/Fabric.Backend.Guild/src/entities/guild-member.entity.ts index ac998ca..bcac4e8 100644 --- a/Fabric.Backend.Guild/src/entities/guild-member.entity.ts +++ b/Fabric.Backend.Guild/src/entities/guild-member.entity.ts @@ -1,13 +1,17 @@ -import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, CreateDateColumn, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity('guild_members') +@Index(['guildId', 'userId'], { unique: true }) +@Index(['guildId', 'status']) export class GuildMember { @PrimaryGeneratedColumn('uuid') id!: string; + @Index() @Column({ type: 'char', length: 36 }) guildId!: string; + @Index() @Column({ type: 'varchar', length: 64 }) userId!: string; @@ -15,5 +19,6 @@ export class GuildMember { status!: 'active' | 'left' | 'blocked'; @CreateDateColumn() + @Index() createdAt!: Date; } diff --git a/Fabric.Backend.Guild/src/entities/message.entity.ts b/Fabric.Backend.Guild/src/entities/message.entity.ts index 9d5766d..83bfebe 100644 --- a/Fabric.Backend.Guild/src/entities/message.entity.ts +++ b/Fabric.Backend.Guild/src/entities/message.entity.ts @@ -3,6 +3,8 @@ import { Column, CreateDateColumn, Entity, Index, PrimaryGeneratedColumn } from @Entity('messages') @Index(['channelId', 'seq'], { unique: true }) @Index(['conversationId', 'seq'], { unique: true }) +@Index(['channelId', 'createdAt']) +@Index(['conversationId', 'createdAt']) export class Message { @PrimaryGeneratedColumn('uuid') id!: string; @@ -25,5 +27,6 @@ export class Message { content!: string; @CreateDateColumn() + @Index() createdAt!: Date; } diff --git a/docs/TODO-backend-center-guild.md b/docs/TODO-backend-center-guild.md index 1106be0..ba0278a 100644 --- a/docs/TODO-backend-center-guild.md +++ b/docs/TODO-backend-center-guild.md @@ -41,7 +41,7 @@ ### 2.1 领域模型 - [x] Guild/Channel/DM 实体补全 - [x] Member/Role 基础模型(即使 MVP 权限全开,也先留结构) -- [ ] 索引设计(channel_id + seq, created_at 等) +- [x] 索引设计(channel_id + seq, created_at 等) ### 2.2 消息主链路 - [ ] 发送消息(content/reply/mentions/attachments 元数据)