接上篇:
https://developer.aliyun.com/article/1224153?groupCode=emas
三、 数据库设计
接下来,需要设计一个数据库表系统支撑上述业务。
首先,进行关系型数据库的设计。如左图所示,“矩形”代表一张表的实体信息。一共有4个实体,包括用户,疫苗,接种点以及预约单。
梳理出这四个实体两两之间的关系。以用户和预约单为例,一张预约单包含用户信息、疫苗信息和接种地点。疫苗和接种点之间存在库存的关系。某个疫苗会分发到多个接种点,方便用户接种。同时,某个接种点也会存在多种预约。
接下来,根据实体关系设计一个模型。右图显示每个实体需要的字段。通常在关系型数据库的设计中,通过三张实体表展示疫苗、接种点以及两者之间多对多的关系。EMAS Serverless基于MongoDB设计,即文档型数据库。它和关系型数据库的区别在于不需要像MySQL一样严格遵守关系型设计。
接下来讲一讲MongoDB设计。MongoDB是文档型数据库,在MongoDB里,“表”被称为“集合”;“集合里的一条数据记录”叫做“一个文档”。如上图所示,JSON格式的文档以key value的形式记录用户数据。
以User为例,存储了三个字段,分别是userId、userName和userAvatar。它们代表了用户ID、用户姓名以及用户头像。
关于接种地点,我们简化了最小业务字段,只关心接种地点的“siteId”和“address”。“siteId”代表接种点的编号,它是全局唯一的。“address”代表接种点的具体地址信息。
关于疫苗表,定义第一个字段“vaccineId”代表疫苗id,是唯一性质的字段。第二个字段是“subType”,代表疫苗的子类型。第三个字段是“type”,代表了疫苗的主类型。“vaccinationObject”和“introduction”字段代表疫苗的接种对象以及详情介绍,“siteList”字段存储疫苗接种点的信息。它以文档嵌入的方式,把实体关系直接存储到副文档里。
“siteList”字段代表一个数组,每个元素包含了两个字段,第一个字段是“siteId”,代表了某个接种点。第二个字段“remainingQuantity”代表了疫苗的剩余数量。
综上所述,疫苗文档存储了疫苗的主类型、副类型、接种对象、疫苗描述、接种地点、地点ID和地点库存。
预约单appointment和其他三个实体都有关系,需要存储userId、sitel和vaccineId。“status”代表了当前预约单状态——用户是否接种。“vaccine”和“site”代表疫苗的详细信息,包含了疫苗ID、疫苗主类型和疫苗子类型。“date”代表疫苗接种日期。
为了避免多次查表提高查询效率,疫苗与接种点分别嵌入一个子文档。以空间换时间的方式,加速预约单的查询速度。
接下来,进入Serverless控制台完成数据库建模。选中服务空间,选中云数据库控制台。创建预约单表、接种地点表、用户表、疫苗信息表之后,一键导入模拟数据。
导入成功后,云数据会自动生成“_id”字段,业务字段siteId和address代表了接种点ID以及接种点地址。
接下来导入疫苗信息。操作方法同上。业务字段包括疫苗的相关信息。
接下篇:https://developer.aliyun.com/article/1224147?groupCode=emas