SET NAMES utf8mb4; -- 宠物档案。代喂任务、送养帖、配种信息都挂在这张表上,所以免疫与绝育状态 -- 放在档案里而不是各自的业务表里——同一只宠物的这些事实只应有一份。 CREATE TABLE IF NOT EXISTS pets ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, owner_user_id BIGINT UNSIGNED NOT NULL, name VARCHAR(30) NOT NULL, species VARCHAR(20) NOT NULL COMMENT 'cat / dog / other', breed VARCHAR(50) NOT NULL DEFAULT '', gender TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 未知 1 公 2 母', birthday DATE NULL, neutered TINYINT(1) NOT NULL DEFAULT 0, weight_g INT UNSIGNED NOT NULL DEFAULT 0, chip_no VARCHAR(40) NOT NULL DEFAULT '', vaccinated_at DATE NULL COMMENT '最近一次免疫日期', dewormed_at DATE NULL COMMENT '最近一次驱虫日期', temperament VARCHAR(200) NOT NULL DEFAULT '', avatar_url VARCHAR(500) NOT NULL DEFAULT '', status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '0 已删除 1 正常', moderation_status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '0 待审核 1 通过 2 驳回', moderation_note VARCHAR(255) NOT NULL DEFAULT '', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), deleted_at DATETIME(3) NULL, PRIMARY KEY (id), KEY idx_pets_owner (owner_user_id, status, id), KEY idx_pets_moderation (moderation_status, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS pet_media ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, pet_id BIGINT UNSIGNED NOT NULL, media_url VARCHAR(500) NOT NULL, sort_order INT UNSIGNED NOT NULL DEFAULT 0, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_pet_media_pet (pet_id, sort_order, id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO system_configs(config_key,config_value,value_type,description) VALUES ('pet.enabled','true','boolean','宠物板块总开关,关闭后客户端不显示宠物入口'), ('pet.max_per_user','10','integer','单个账号可建立的宠物档案数量上限'), ('pet.max_photos','9','integer','单只宠物的照片数量上限') ON DUPLICATE KEY UPDATE description=VALUES(description);