-- Group id is a table-local AUTO_INCREMENT 群号. Chat / sync still use Snowflake conversations.id. CREATE TABLE IF NOT EXISTS `groups` ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '群号,表内自增,对外群 ID', conversation_id BIGINT NOT NULL COMMENT '对应 conversations.id(Snowflake),发消息与同步用', name VARCHAR(32) NOT NULL COMMENT '群名称', avatar VARCHAR(512) NOT NULL DEFAULT '' COMMENT '群头像对象存储 key,空表示未设置', owner_id BIGINT NOT NULL COMMENT '群主 user_id', muted_all TINYINT NOT NULL DEFAULT 0 COMMENT '0=未全员禁言 1=全员禁言(群主/管理员仍可发言)', member_count INT NOT NULL DEFAULT 0 COMMENT '当前成员数,含群主', status TINYINT NOT NULL DEFAULT 1 COMMENT '1=正常 2=已解散', created_at DATETIME(3) NOT NULL COMMENT '创建时间', updated_at DATETIME(3) NOT NULL COMMENT '资料或成员变更时间', PRIMARY KEY (id), UNIQUE KEY uk_conversation (conversation_id), KEY idx_owner_id (owner_id), KEY idx_status_updated (status, updated_at) ) COMMENT='群资料。id 是自增群号;会话列表与未读仍按 conversation_id 走 Redis'; CREATE TABLE IF NOT EXISTS group_members ( group_id BIGINT NOT NULL COMMENT '群号,groups.id', user_id BIGINT NOT NULL COMMENT '成员 user_id', role TINYINT NOT NULL DEFAULT 3 COMMENT '1=群主 2=管理员 3=普通成员', nickname VARCHAR(32) NOT NULL DEFAULT '' COMMENT '群内昵称,空则用用户昵称', speak_muted TINYINT NOT NULL DEFAULT 0 COMMENT '0=未禁言 1=被单独禁言', joined_at DATETIME(3) NOT NULL COMMENT '入群时间', PRIMARY KEY (group_id, user_id), KEY idx_user_id (user_id) ) COMMENT='群成员与角色。热路径 MemberIDs 可短缓存;免打扰在 conversation_members';