菜单

数据模型

相关源文件

本文档提供了 RealWorld 应用程序中使用的数据模型的详细信息。这些模型代表了应用程序的核心实体:用户、文章、评论和标签。本页重点介绍每个模型的属性和结构。有关模型之间关系的详细信息,请参阅 关系

数据库模式概述

RealWorld 应用程序使用 SQLite 数据库,表通过 Prisma 定义。下图说明了主要数据模型及其关系。

实体关系图

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

数据库到 API 的映射

下图说明了数据库模型如何通过 API 规范公开。

来源: api/openapi.yml422-835

用户模型

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指示用户是否为演示用户的标志

API 表示

在 API 中,User 模型通过两种不同的模式表示。

  1. User Schema - 用于已认证用户的信息

    • email
    • token (JWT 认证令牌,不存储在数据库中)
    • username
    • bio
    • image
  2. Profile Schema - 用于检索有关其他用户信息时

    • username
    • bio
    • image
    • following (布尔值,指示当前用户是否关注此用户)

来源

Article 模型

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指向撰写文章的用户

API 表示

在 API 中,Article 模式包含几个计算字段,这些字段未直接存储在数据库中。

属性类型描述
slug字符串标题的 URL 友好版本
title字符串文章标题
description字符串文章描述
body字符串文章的正文内容
tagListarray[string]关联标签列表
createdAtstring (date-time)创建时间戳
updatedAtstring (date-time)最后更新时间戳
favorited布尔值当前用户是否已收藏此文章
favoritesCount整数收藏此文章的用户数
作者配置文件撰写文章的用户的个人资料

来源

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指向撰写评论的用户

API 表示

在 API 中,Comment 模式包含:

属性类型描述
id整数评论的唯一标识符
createdAtstring (date-time)创建时间戳
updatedAtstring (date-time)最后更新时间戳
body字符串评论内容
作者配置文件撰写评论的用户的个人资料

来源

Tag 模型

Tag 模型代表可以与文章关联的标签。

数据库属性

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

API 表示

在 API 中,标签在两种上下文中表示:

  1. 在 Article 模式的 tagList 属性中,作为字符串数组
  2. 在 Tags 端点响应中,它返回所有标签的数组。

来源

连接表

RealWorld 应用程序使用几个连接表来表示主要数据模型之间的多对多关系。

_ArticleToTag

将文章链接到标签,实现多对多关系。

属性类型约束描述
AINTEGERNOT NULL, FOREIGN KEY指向 Article.id
BINTEGERNOT NULL, FOREIGN KEY指向 Tag.id

_UserFavorites

记录了哪些用户收藏了哪些文章。

属性类型约束描述
AINTEGERNOT NULL, FOREIGN KEY指向 Article.id
BINTEGERNOT NULL, FOREIGN KEY指向 User.id

_UserFollows

记录了用户之间的关注关系。

属性类型约束描述
AINTEGERNOT NULL, FOREIGN KEY指向关注者 User.id
BINTEGERNOT NULL, FOREIGN KEY指向被关注用户的 User.id

来源

数据库索引

数据库使用多个索引来提高查询性能和强制执行唯一约束。

索引名称表格类型目的
Article_slug_key文章slugUNIQUE确保文章 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.sql67-95

API 中的数据模型使用情况

本文档中描述的数据模型构成了 RealWorld API 的基础。它们用于各种 API 端点以实现应用程序的功能。

  • 用户认证和个人资料管理(登录、注册、个人资料查看)
  • 文章创建、编辑、删除和收藏
  • 评论创建和删除
  • 标签检索和按标签过滤文章

有关这些模型之间关系的更详细解释,请参阅 关系 页面。

来源: api/openapi.yml22-421