本文档概述了 RealWorld 项目中使用的数据库模式。它提供了数据模型、它们之间的关系、约束和使用模式的详细描述。该模式是 API 实现的基础,并定义了应用程序如何存储、检索和关联数据。
有关 API 如何与此数据库模式交互的信息,请参阅 API 规范。
RealWorld 应用程序使用关系型数据库模式,该模式模拟了一个类似 Medium.com 的博客平台。该模式由四个主要实体(用户、文章、评论、标签)和几个建立这些实体之间连接的关系表组成。
数据库实现使用 SQLite 进行开发(如 dev.db 文件所示),并使用 Prisma Schema 定义,Prisma Schema 管理数据库迁移并提供数据访问层。
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql1-95
以下实体关系图显示了所有表、它们的字段以及它们之间的关系
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql1-95
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 | 指示是否为演示账户的标志 |
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql33-41
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 | 引用创建文章的用户 |
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql2-12
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 | 创建评论的用户 |
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql15-24
Tag 表存储用于分类的文章标签。
| 字段 | 类型 | 约束 | 描述 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY, AUTOINCREMENT | 唯一标识符 |
| 名称 | TEXT | NOT NULL, UNIQUE | 标签名称 |
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql27-30
数据库使用连接表来实现实体之间的多对多关系。
此表建立文章和标签之间的多对多关系。
| 字段 | 类型 | 约束 | 描述 |
|---|---|---|---|
| A | INTEGER | NOT NULL, FOREIGN KEY | 引用 Article.id |
| B | INTEGER | NOT NULL, FOREIGN KEY | 引用 Tag.id |
该表在 (A, B) 上具有唯一约束,并在 B 上具有索引以提高性能。
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql44-49 apps/api/prisma/migrations/20241009081140_init/migration.sql80-83
此表跟踪哪些用户收藏了哪些文章。
| 字段 | 类型 | 约束 | 描述 |
|---|---|---|---|
| A | INTEGER | NOT NULL, FOREIGN KEY | 引用 Article.id |
| B | INTEGER | NOT NULL, FOREIGN KEY | 引用 User.id |
该表在 (A, B) 上具有唯一约束,并在 B 上具有索引以提高性能。
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql52-57 apps/api/prisma/migrations/20241009081140_init/migration.sql86-89
此自引用表实现了用户之间的“关注”关系。
| 字段 | 类型 | 约束 | 描述 |
|---|---|---|---|
| A | INTEGER | NOT NULL, FOREIGN KEY | 引用 User.id (关注者) |
| B | INTEGER | NOT NULL, FOREIGN KEY | 引用 User.id (被关注者) |
该表在 (A, B) 上具有唯一约束,并在 B 上具有索引以提高性能。
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql60-65 apps/api/prisma/migrations/20241009081140_init/migration.sql92-95
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql52-65
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql44-57
数据库模式使用 Prisma(一种 ORM(对象关系映射)工具)实现。模式在 Prisma 迁移文件中定义,并通过 Prisma 的迁移系统进行管理。
初始迁移脚本创建了所有表、关系和索引
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql1-95 apps/api/package.json8-19
下图显示了用户发布新文章时的数据流
下图显示了用户关注另一用户时的数据流
该模式包含多个索引以提高查询性能
| 索引名称 | 表格 | 字段 | 类型 | 目的 |
|---|---|---|---|---|
| Article_slug_key | 文章 | slug | UNIQUE | 确保文章 slug 唯一,并可快速按 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.sql68-95
该模式通过各种约束强制执行数据完整性
ON DELETE CASCADE 行为可确保当父记录被删除时,所有相关的子记录都会被自动删除,从而在没有孤立记录的情况下维护引用完整性。
来源: apps/api/prisma/migrations/20241009081140_init/migration.sql1-95
User 模型支持身份验证(通过电子邮件/密码)和公开资料(用户名、简介、图像)。_UserFollows 关系允许用户关注彼此,从而创建社交网络方面。
文章由用户创建,并可以使用标签进行组织。slug 字段提供 SEO 友好的 URL。评论允许用户参与文章。
该模式支持关键的社交功能
这些功能通过关系表实现,创造了互联的社交体验。