# 一、Schema范式设计
## 发布帖子模块
- 1. 模块功能
发布帖子模块允许用户分享他们的旅游经历、照片和建议。主要功能包括：

文本输入：用户可以输入帖子标题和内容，描述他们的旅行经历。
图片上传：用户可以上传多张旅行照片，增强帖子内容的吸引力。
位置标记：用户可以选择旅行目的地的地理位置，提供更具体的信息。
标签添加：用户可以为帖子添加相关标签（如“海滩”、“山脉”、“城市游”等），方便其他用户搜索。
隐私设置：用户可以选择帖子是公开可见，还是仅限好友可见。
预览功能：用户在发布前可以预览帖子效果，确保内容和格式符合期望。
发布和保存草稿：用户可以选择立即发布帖子或保存为草稿，以便后续编辑。
2. 用户界面设计
发布帖子按钮：在首页或个人页面有一个明显的“发布帖子”按钮。

- 发布帖子页面：

标题输入框：输入帖子标题。
内容输入框：富文本编辑器，支持文本格式化（如加粗、斜体、列表等）。
图片上传区域：拖放区域或“选择文件”按钮，支持多张图片上传。
位置选择：地图组件或下拉菜单，用户可以选择或搜索目的地。
标签输入框：可输入多个标签，使用逗号分隔。
隐私设置：选择框，用户可以选择公开或私密。
预览按钮：查看帖子发布后的效果。
发布和保存按钮：用户可以选择发布或保存为草稿。

# 表设计
为了设计一个符合规范的Parse Schema，我们需要创建几个表（Class），每个表将包含具体的字段。根据您描述的旅游App发布帖子模块，以下是所需的表及其字段的设计。

### 1. Parse Schema 设计

我们将创建以下几个表：

- **User**：用户表，用于存储用户信息。
- **Post**：帖子表，用于存储用户发布的帖子信息。
- **Image**：图片表，用于存储与帖子相关的图片信息。
- **Tag**：标签表，用于存储标签信息。

### 2. 表结构及字段设计

#### User 表

- **表名**：User
- **字段**：
  - `objectId` (默认字段)
  - `createdAt` (默认字段)
  - `username` (String) - 用户名
  - `email` (String) - 用户邮箱
  - `profilePicture` (File) - 用户头像

#### Post 表

- **表名**：Post
- **字段**：
  - `objectId` (默认字段)
  - `createdAt` (默认字段)
  - `title` (String) - 帖子标题
  - `content` (String) - 帖子内容
  - `location` (GeoPoint) - 帖子位置
  - `privacy` (String) - 帖子隐私设置（公开/私密）
  - `user` (Pointer<User>) - 发布用户（外键关联到User表）
  - `tags` (Array<Pointer<Tag>>) - 帖子标签（外键关联到Tag表）
  - `images` (Array<Pointer<Image>>) - 帖子图片（外键关联到Image表）

#### Image 表

- **表名**：Image
- **字段**：
  - `objectId` (默认字段)
  - `createdAt` (默认字段)
  - `url` (String) - 图片URL
  - `post` (Pointer<Post>) - 关联的帖子（外键关联到Post表）

#### Tag 表

- **表名**：Tag
- **字段**：
  - `objectId` (默认字段)
  - `createdAt` (默认字段)
  - `name` (String) - 标签名称

### 3. PlantUML 类图表示

以下是使用PlantUML表示的类图，展示了各个表及其字段和关系：

```plantuml
@startuml

class User {
    +objectId: String
    +createdAt: Date
    +username: String
    +email: String
    +profilePicture: File
}

class Post {
    +objectId: String
    +createdAt: Date
    +title: String
    +content: String
    +location: GeoPoint
    +privacy: String
    +user: Pointer<User>
    +tags: Array<Pointer<Tag>>
    +images: Array<Pointer<Image>>
}

class Image {
    +objectId: String
    +createdAt: Date
    +url: String
    +post: Pointer<Post>
}

class Tag {
    +objectId: String
    +createdAt: Date
    +name: String
}

User "1" -- "0..*" Post : has
Post "1" -- "0..*" Image : contains
Post "0..*" -- "0..*" Tag : tagged with

@enduml
```

### 4. 设计范式说明

- **第一范式**：所有字段都是原子性的，表中没有重复的列。
- **第二范式**：所有非主键字段都完全依赖于主键，确保没有部分依赖。
- **第三范式**：没有传递依赖，所有非主键字段都直接依赖于主键。

