本文档提供了 RealWorld 应用程序中使用的数据模型的详细信息。这些模型代表了应用程序的核心实体:用户、文章、评论和标签。本页重点介绍每个模型的属性和结构。有关模型之间关系的详细信息,请参阅 关系。
RealWorld 应用程序使用 SQLite 数据库,表通过 Prisma 定义。下图说明了主要数据模型及其关系。
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql2-95
下图说明了数据库模型如何通过 API 规范公开。
User 模型代表了应用程序的用户。用户可以撰写文章和评论,关注其他用户,以及收藏文章。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY, AUTOINCREMENT | 用户的唯一标识符 |
| TEXT | NOT NULL, UNIQUE | 用户邮箱地址 | |
| username | TEXT | NOT NULL, UNIQUE | 用户的用户名 |
| password | TEXT | NOT NULL | 用户的密码(已哈希) |
| image | TEXT | DEFAULT 'https://api.realworld.io/images/smiley-cyrus.jpeg' | 用户头像的 URL |
| bio | TEXT | NULL | 用户的个人简介 |
| demo | BOOLEAN | NOT NULL, DEFAULT false | 指示用户是否为演示用户的标志 |
在 API 中,User 模型通过两种不同的模式表示。
User Schema - 用于已认证用户的信息
Profile Schema - 用于检索有关其他用户信息时
来源
Article 模型代表用户发布的文章。文章可以有评论和标签,并且可以被用户收藏。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY, AUTOINCREMENT | 文章的唯一标识符 |
| slug | TEXT | NOT NULL, UNIQUE | 标题的 URL 友好版本 |
| title | TEXT | NOT NULL | 文章标题 |
| description | TEXT | NOT NULL | 文章的简短描述/摘要 |
| body | TEXT | NOT NULL | 文章的正文内容 |
| createdAt | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 文章创建时间 |
| updatedAt | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 文章最后更新时间 |
| authorId | INTEGER | NOT NULL, FOREIGN KEY | 指向撰写文章的用户 |
在 API 中,Article 模式包含几个计算字段,这些字段未直接存储在数据库中。
| 属性 | 类型 | 描述 |
|---|---|---|
| slug | 字符串 | 标题的 URL 友好版本 |
| title | 字符串 | 文章标题 |
| description | 字符串 | 文章描述 |
| body | 字符串 | 文章的正文内容 |
| tagList | array[string] | 关联标签列表 |
| createdAt | string (date-time) | 创建时间戳 |
| updatedAt | string (date-time) | 最后更新时间戳 |
| favorited | 布尔值 | 当前用户是否已收藏此文章 |
| favoritesCount | 整数 | 收藏此文章的用户数 |
| 作者 | 配置文件 | 撰写文章的用户的个人资料 |
来源
Comment 模型代表用户在文章上发表的评论。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY, AUTOINCREMENT | 评论的唯一标识符 |
| createdAt | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 评论创建时间 |
| updatedAt | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 评论最后更新时间 |
| body | TEXT | NOT NULL | 评论内容 |
| articleId | INTEGER | NOT NULL, FOREIGN KEY | 指向评论所属的文章的引用 |
| authorId | INTEGER | NOT NULL, FOREIGN KEY | 指向撰写评论的用户 |
在 API 中,Comment 模式包含:
| 属性 | 类型 | 描述 |
|---|---|---|
| id | 整数 | 评论的唯一标识符 |
| createdAt | string (date-time) | 创建时间戳 |
| updatedAt | string (date-time) | 最后更新时间戳 |
| body | 字符串 | 评论内容 |
| 作者 | 配置文件 | 撰写评论的用户的个人资料 |
来源
Tag 模型代表可以与文章关联的标签。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY, AUTOINCREMENT | 标签的唯一标识符 |
| 名称 | TEXT | NOT NULL, UNIQUE | 标签名称 |
在 API 中,标签在两种上下文中表示:
tagList 属性中,作为字符串数组来源
RealWorld 应用程序使用几个连接表来表示主要数据模型之间的多对多关系。
将文章链接到标签,实现多对多关系。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| A | INTEGER | NOT NULL, FOREIGN KEY | 指向 Article.id |
| B | INTEGER | NOT NULL, FOREIGN KEY | 指向 Tag.id |
记录了哪些用户收藏了哪些文章。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| A | INTEGER | NOT NULL, FOREIGN KEY | 指向 Article.id |
| B | INTEGER | NOT NULL, FOREIGN KEY | 指向 User.id |
记录了用户之间的关注关系。
| 属性 | 类型 | 约束 | 描述 |
|---|---|---|---|
| A | INTEGER | NOT NULL, FOREIGN KEY | 指向关注者 User.id |
| B | INTEGER | NOT NULL, FOREIGN KEY | 指向被关注用户的 User.id |
来源
数据库使用多个索引来提高查询性能和强制执行唯一约束。
| 索引名称 | 表格 | 列 | 类型 | 目的 |
|---|---|---|---|---|
| Article_slug_key | 文章 | slug | UNIQUE | 确保文章 slug 的唯一性 |
| Tag_name_key | 标签 | 名称 | UNIQUE | 确保标签名称的唯一性 |
| User_email_key | 用户 | UNIQUE | 确保用户电子邮件的唯一性 | |
| User_username_key | 用户 | username | UNIQUE | 确保用户名的唯一性 |
| _ArticleToTag_AB_unique | _ArticleToTag | A, B | UNIQUE | 防止重复的文章-标签关联 |
| _ArticleToTag_B_index | _ArticleToTag | B | INDEX | 提高按标签查找文章的查询性能 |
| _UserFavorites_AB_unique | _UserFavorites | A, B | UNIQUE | 防止重复的用户-文章收藏 |
| _UserFavorites_B_index | _UserFavorites | B | INDEX | 提高按用户查找收藏文章的查询性能 |
| _UserFollows_AB_unique | _UserFollows | A, B | UNIQUE | 防止重复的用户关注关系 |
| _UserFollows_B_index | _UserFollows | B | INDEX | 提高查找用户关注者的查询性能 |
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql67-95
本文档中描述的数据模型构成了 RealWorld API 的基础。它们用于各种 API 端点以实现应用程序的功能。
有关这些模型之间关系的更详细解释,请参阅 关系 页面。