# 首页数据表结构设计 ## 1. 实体关系总览 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Category │──────<│ Card │>──────│ Tag │ │ (分类) │ 1:N │ (卡片) │ N:N │ (标签) │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ 1:N ▼ ┌─────────────┐ │ Tool │ │ (工具项) │ └─────────────┘ ``` ## 2. 表结构 ### 2.1 Category(分类表) | 字段 | 类型 | 说明 | |------|------|------| | id | VARCHAR(36) PK | 主键 UUID | | name | VARCHAR(100) | 分类名称 | | slug | VARCHAR(100) | URL-friendly 标识,唯一 | | image | VARCHAR(500) | 分类图标/封面 | | parent_id | VARCHAR(36) FK | 上级分类,NULL 表示顶级 | | sort_order | INT DEFAULT 0 | 排序权重 | | count | INT DEFAULT 0 | 该分类下的卡片数量 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **索引**: - `idx_category_parent` ON (parent_id) - `idx_category_slug` ON (slug) UNIQUE ### 2.2 Card(卡片表) | 字段 | 类型 | 说明 | |------|------|------| | id | BIGINT PK AUTO_INCREMENT | 主键 | | type | ENUM('text','image','image-text','portfolio','project') | 卡片类型 | | title | VARCHAR(255) | 标题 | | description | TEXT | 描述内容 | | aspect_ratio | DECIMAL(4,2) | 宽高比,用于瀑布流布局 | | category_id | VARCHAR(36) FK | 所属分类 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | **索引**: - `idx_card_category` ON (category_id) - `idx_card_type` ON (type) - `idx_card_created` ON (created_at DESC) ### 2.3 CardImage(卡片图片表) | 字段 | 类型 | 说明 | |------|------|------| | id | BIGINT PK AUTO_INCREMENT | 主键 | | card_id | BIGINT FK | 所属卡片 | | url | VARCHAR(500) | 图片地址 | | sort_order | INT DEFAULT 0 | 在卡片内的排序 | **索引**: - `idx_card_image_card` ON (card_id) ### 2.4 Tag(标签表) | 字段 | 类型 | 说明 | |------|------|------| | id | BIGINT PK AUTO_INCREMENT | 主键 | | name | VARCHAR(50) | 标签名 | | slug | VARCHAR(50) | URL-friendly 标识,唯一 | **索引**: - `idx_tag_slug` ON (slug) UNIQUE ### 2.5 CardTag(卡片-标签关联表) | 字段 | 类型 | 说明 | |------|------|------| | card_id | BIGINT FK | 卡片 ID | | tag_id | BIGINT FK | 标签 ID | **索引**: - `idx_card_tag_card` ON (card_id) - `idx_card_tag_tag` ON (tag_id) - PRIMARY KEY (card_id, tag_id) ### 2.6 Tool(工具项表) | 字段 | 类型 | 说明 | |------|------|------| | id | VARCHAR(36) PK | 主键 | | name | VARCHAR(50) | 工具名称 | | slug | VARCHAR(50) | 标识 | | icon | VARCHAR(100) | 图标名称 | | sort_order | INT DEFAULT 0 | 排序 | ## 3. 实体关系说明 | 关系 | 描述 | |------|------| | Category → Card | 1:N,一个分类下有多张卡片 | | Category ↻ Category | 自引用 1:N,分类的层级结构 | | Card → CardImage | 1:N,一张卡片有多张图片 | | Card → Tag | N:N,通过 CardTag 关联 | | Tool | 独立表,无外键关联 | ## 4. 设计原则 1. **避免外键耦合**:CardTag 关联表仅做关联,不级联删除 2. **类型安全**:Card.type 使用 ENUM 约束,避免字符串污染 3. **层级查询优化**:Category 自引用通过 parent_id 索引加速 4. **瀑布流适配**:Card.aspect_ratio 存储小数,精确控制卡片比例 5. **扩展性**:CardImage 支持多图,Card 支持 N:N 标签关联 ## 5. 示例数据 ### 分类示例 | id | name | slug | parent_id | |----|------|------|-----------| | c1 | 全部灵感 | all | NULL | | c2 | 设计 | design | c1 | | c3 | 摄影 | photo | c1 | | c4 | 文字摘录 | words | c1 | | c5 | 项目档案 | projects | c1 | | c6 | 随手收藏 | inspiration | c1 | | c7 | 平面/海报 | design-graphic | c2 | | c8 | 产品/UI | design-product | c2 | ### 卡片示例 | id | type | title | aspect_ratio | category_id | |----|------|-------|--------------|-------------| | 1 | image-text | 极简主义海报 | 0.75 | c7 | | 2 | project | Web 项目展示 | 1.00 | c8 | | 3 | portfolio | 2x2 图集 | 0.67 | c5 |