在前面的模块中,我们介绍了数据库的概念,讨论了它们存储的数据类型,并练习了发送REST API请求来检索数据。同时,我们在这个过程中仍然是一个外部参与者,只要求从各种来源获得信息。

现在是创建你的数据库的时候了!在这个模块中,我们将做到这一点,我们将了解数据如何存储在数据库中,以及它们如何相互连接。但首先,让我们从理论开始。让我们处理一下数据以何种形式出现在我们面前,以及根据数据结构将数据库分为哪些类别。

数据基础知识

数据表示法

在REST API中,数据表示的绝对领导者是JSON格式。在前面模块的所有例子中,我们都收到了这种格式的数据。值得一提的是,REST并没有对我们的格式选择进行限制,在未来,你肯定会遇到其他的格式(例如,XML)。同时,由于其重量轻,易于人类阅读,开发人员通常更喜欢JSON。

JSON(JavaScript Object Notation)是一种基于JavaScript的文本数据交换格式。而且,不要让标题中的JavaScript欺骗你。JSON格式虽然起源于这种编程语言,但完全独立于它,可以在任何地方使用。

让我们看看一个JSON对象由什么组成,以及它是如何写的。

你收到的所有数据都被括在大括号"{}"中。它们总是被放在JSON对象的开头和结尾处。

对象本身由一组记录组成,这些记录是 "键:值 "对,彼此之间用逗号","分开。

键是记录本身的名称,用引号""括起来。例子。"名称","价值","地区","地址"。它可以是任何词,在开发时主要是确保这个意思是清楚的。

值可以是各种类型的。让我们把它们都考虑进去。

  1. 字符串。包含文本信息,是Unicode标准中的一组字符。字符串用引号""括起来。
  2. 数字。可以是整数,也可以是浮点。它按原样书写,不需要用引号括起来。
  3. 布尔值。两个值中的一个。要么是真,要么是假。像数字一样,它的书写不需要引号。
  4. 阵列。一个有序的元素集合。每个元素可以是任何类型。一个数组用方括号"[]"括起来,它的元素用逗号隔开。
  5. 对象。JSON值可以是另一个JSON对象。同样的规则适用于它和根对象。它也被括在大括号中,并包含它自己的记录集。

带着这些信息看一下你在第一个模块中收到的数据。选择JSON组件,确定收到的值属于什么类型。

储存数据

我们已经处理了JSON。现在我们转到最主要的东西--数据库。数据可以以各种方式存储在其中。同时,从历史上看,它的发展使关系型数据库模型得到了最大的分布。

当使用关系模型时,数据以表的形式存储,有一组特定的数据,其结构在数据库设计阶段被严格规定。关系型数据库中对数据结构的描述被称为模式。它定义了表的组成,这些表中字段的结构,以及它们之间的关系。

DBMS使用SQL语言来管理具有关系模式的数据。

SQL - 结构化查询语言。这是一种声明性语言,这意味着它的命令只描述必要的动作(查找数据、删除它们、改变),每个DBMS自己决定如何执行。

有许多不同的关系型DBMS。其中最常见的是Oracle, MySQL, MS SQL,PostgreSQL。顺便说一下,AppMaster使用PostgreSQL,这意味着它使用了现代先进的DBMS,在大量不同的组织中工作,也是免费软件(也就是说,你不需要为使用它支付额外的钱)。

你是否注意到几乎每个DBMS的名称中都有SQL的缩写?实际上,关系型数据库的另一个名称是SQL数据库。

然而,还有一种替代方法。非关系型数据库,或称NoSQL。值得注意的是,这里的No不是 "不 "的否定,而是Not only的缩略语。就是说,"不仅是SQL"。

非关系型DBMS不使用通用的查询格式(如SQL),它们中的每一个都实现了自己处理数据的方式。

它们不需要一个唯一定义的数据存储结构。数据本身不是以严格的表的形式存储在其中,而是以具有任意属性集的对象的形式(很像JSON)。在处理结构经常变化的数据时,这可能是相关的。

同时,由于其自由结构,如果你需要创建一个分布在多个服务器上的数据库,NoSQL解决方案更容易扩展。

NoSQL DBMS的例子包括MongoDB和Redis。

数据库设计

现在是时候设计你自己的数据库了。要做到这一点,请进入左侧面板上的标签数据设计(Data Designer)。

数据库中的数据是以特殊表(模型)的形式存储的。你可以注意到,我们已经有一个模型。它是授权模块的一部分,默认包含在每个项目中。由于它,应用程序的新用户被创建,现有用户被管理。但我们现在不会纠结于它的研究,而是要创建我们自己的模型。

想象一下,我们正在开发一个地图服务。让我们创建一个包含国家信息的模型。要创建它,你需要在画布的一个空白区域右击并选择创建空模型。

要创建,我们只需要指定模型的名称。我们将在本课程的其他模块中处理自动生成端点和用户界面元素的问题。

请注意,在创建之后,模型已经包含了4个字段。这些是系统字段,它们的存在大大简化了模型的初始创建和进一步使用。

  1. ID(整数) - 唯一的标识符,主键。它为表中的每个新条目自动创建,目的是确保没有重复的条目。正是通过ID,你可以唯一地识别表中的一条记录。它的值从1开始,每一个新条目都自动增加1。
  2. CreatedAt (datetime) - 在表中创建记录的时间。
  3. UpdatedAt (datetime) - 该条目最后一次被修改的时间。
  4. DeletedAt (datetime) - 该条目被删除的时间。当然,只有在使用了软删除的情况下。也就是说,这样的删除,当记录只被标记为删除,并通过访问它的请求进行过滤,但同时物理上仍然在表中。这与批量删除不同,后者实际上完全删除了数据。

除了系统的字段外,在创建的模型中添加自定义字段也是明智的。假设我们想看到国家的名称和一些关于它的信息描述。

选择一个字段类型不应该是一个问题。对于名字来说,String是合适的,对于信息描述来说,Text是合适的。


此外,还有四个开关可用。

  1. Multiple values (Array) - 使用数组而不是单一条目。
  2. 非空--指定的字段不能为空,它必须始终包含数据。
  3. 唯一 - 字段的值必须是唯一的,在这个模型中,不能有两条记录的这个字段的值是相同的。
  4. 索引 - 表示将为这个字段创建一个特殊的索引,以便加快搜索速度。

一般来说,只有在真的有必要的情况下,才会勾选标记。例如,我们可以为国家名称标记 "非空 "和 "唯一",假设不可能有一个没有名称的国家,或两个有相同名称的国家。然而,在创建应用程序的逻辑阶段控制这一点是个好主意,而不是对数据库本身进行限制。

同样地,创建一个包含城市信息的表。想一想它可以包含哪些数据字段,这些字段是什么类型。

数据库中的数据并不是以分散的表的形式独立存在的。它们是以某种方式相互关联的。开发数据模型的关键是定义这些关系并建立关系。

为了建立这种联系,有必要用鼠标从一个模型的边界到另一个模型画一条线。在我们的例子中,我们肯定知道每个城市都位于某个国家,所以我们可以建立一个从国家到城市的链接。


有3种不同类型的连接。

  1. 一对一(有一个)。表中的每条记录都被映射到相关表中的一条记录(反过来也是如此)。一个简单的例子是一个人和他们的护照。我们总是可以确定这种连接是唯一的。一本护照只能有一个持有人,而每个人只能有一本有效的护照。
  2. 一对多(有很多)。一个表中的每条记录可以在另一个表中有许多记录。我们的数据库就是一个类似的例子。一个国家可以有许多不同的城市,但每个城市只能属于一个国家。这就是我们要做的连接。
  3. 多对多。一种关系,其中一个表中的多个记录可以对应于另一个表中的多个记录。一个简单的例子是教师和学生之间的关系。每个老师可以教很多学生,正如每个学生可以从很多不同的老师那里学习一样。

家庭作业

想象一下,你必须为一个在线商店开发一个应用程序。创建一个数据库模型,让它工作。

  • 有必要为商品的可用性提供其描述的卡片,各种商品的类别,关于订单和客户的信息。
  • 用各种类型的字段填充表格(至少使用5种类型)。
  • 建立表之间的关系。使用所有3种链接类型。