菜单

数据库 Schema

相关源文件

本文档概述了 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 表存储了应用程序注册用户的信息。

字段类型约束描述
idINTEGERPRIMARY KEY, AUTOINCREMENT唯一标识符
emailTEXTNOT NULL, UNIQUE用户邮箱地址
usernameTEXTNOT NULL, UNIQUE用户的唯一用户名
passwordTEXTNOT NULL加密后的密码
imageTEXTDEFAULT 'https://api.realworld.io/images/smiley-cyrus.jpeg'个人资料图片 URL
bioTEXTNULL用户简介
demoBOOLEANNOT NULL, DEFAULT false指示是否为演示账户的标志

来源: apps/api/prisma/migrations/20241009081140_init/migration.sql33-41

文章

Article 表存储用户创建的博客帖子。

字段类型约束描述
idINTEGERPRIMARY KEY, AUTOINCREMENT唯一标识符
slugTEXTNOT NULL, UNIQUE标题的 URL 友好版本
titleTEXTNOT NULL文章标题
descriptionTEXTNOT NULL简短描述或副标题
bodyTEXTNOT NULL文章正文
createdAtDATETIMENOT NULL, DEFAULT CURRENT_TIMESTAMP创建时间戳
updatedAtDATETIMENOT NULL, DEFAULT CURRENT_TIMESTAMP最后更新时间戳
authorIdINTEGERNOT NULL, FOREIGN KEY引用创建文章的用户

来源: apps/api/prisma/migrations/20241009081140_init/migration.sql2-12

Comment

Comment 表存储用户对文章的评论。

字段类型约束描述
idINTEGERPRIMARY KEY, AUTOINCREMENT唯一标识符
createdAtDATETIMENOT NULL, DEFAULT CURRENT_TIMESTAMP创建时间戳
updatedAtDATETIMENOT NULL, DEFAULT CURRENT_TIMESTAMP最后更新时间戳
bodyTEXTNOT NULL评论内容
articleIdINTEGERNOT NULL, FOREIGN KEY评论所属的文章
authorIdINTEGERNOT NULL, FOREIGN KEY创建评论的用户

来源: apps/api/prisma/migrations/20241009081140_init/migration.sql15-24

标签

Tag 表存储用于分类的文章标签。

字段类型约束描述
idINTEGERPRIMARY KEY, AUTOINCREMENT唯一标识符
名称TEXTNOT NULL, UNIQUE标签名称

来源: apps/api/prisma/migrations/20241009081140_init/migration.sql27-30

关系表

数据库使用连接表来实现实体之间的多对多关系。

_ArticleToTag

此表建立文章和标签之间的多对多关系。

字段类型约束描述
AINTEGERNOT NULL, FOREIGN KEY引用 Article.id
BINTEGERNOT 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

_UserFavorites

此表跟踪哪些用户收藏了哪些文章。

字段类型约束描述
AINTEGERNOT NULL, FOREIGN KEY引用 Article.id
BINTEGERNOT 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

_UserFollows

此自引用表实现了用户之间的“关注”关系。

字段类型约束描述
AINTEGERNOT NULL, FOREIGN KEY引用 User.id (关注者)
BINTEGERNOT 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

数据流示例

发布文章

下图显示了用户发布新文章时的数据流

来源: api/openapi.yml206-223

关注用户

下图显示了用户关注另一用户时的数据流

来源: api/openapi.yml108-130

数据库索引

该模式包含多个索引以提高查询性能

索引名称表格字段类型目的
Article_slug_key文章slugUNIQUE确保文章 slug 唯一,并可快速按 slug 查找
Tag_name_key标签名称UNIQUE确保标签名称唯一,并可快速按名称查找
User_email_key用户emailUNIQUE确保用户电子邮件唯一,并可快速按电子邮件查找
User_username_key用户usernameUNIQUE确保用户名唯一,并可快速按用户名查找
_ArticleToTag_AB_unique_ArticleToTagA, BUNIQUE防止重复的文章-标签关系
_ArticleToTag_B_index_ArticleToTagBINDEX优化按标签查询文章
_UserFavorites_AB_unique_UserFavoritesA, BUNIQUE防止重复的收藏关系
_UserFavorites_B_index_UserFavoritesBINDEX优化按用户查询收藏
_UserFollows_AB_unique_UserFollowsA, BUNIQUE防止重复的关注关系
_UserFollows_B_index_UserFollowsBINDEX优化查询用户的关注者

来源: apps/api/prisma/migrations/20241009081140_init/migration.sql68-95

约束和引用完整性

该模式通过各种约束强制执行数据完整性

  1. 主键约束:每个表都有一个自动递增的整数主键。
  2. 唯一约束:对文章 slug、标签名称、用户电子邮件和用户名强制执行。
  3. 外键约束:通过 ON DELETE CASCADE 行为建立表之间的关系。
  4. 非空约束:确保始终提供必需的字段。
  5. 默认值:为时间戳和用户图像等字段提供合理的默认值。

ON DELETE CASCADE 行为可确保当父记录被删除时,所有相关的子记录都会被自动删除,从而在没有孤立记录的情况下维护引用完整性。

来源: apps/api/prisma/migrations/20241009081140_init/migration.sql1-95

数据模型使用模式

身份验证和用户配置文件

User 模型支持身份验证(通过电子邮件/密码)和公开资料(用户名、简介、图像)。_UserFollows 关系允许用户关注彼此,从而创建社交网络方面。

内容创建和组织

文章由用户创建,并可以使用标签进行组织。slug 字段提供 SEO 友好的 URL。评论允许用户参与文章。

社交互动

该模式支持关键的社交功能

  • 关注其他用户
  • 收藏文章
  • 评论文章

这些功能通过关系表实现,创造了互联的社交体验。

来源: api/openapi.yml1-836