Schema 指的是数据表格的结构或者叫模式,在传统的关系型数据库里,在往数据表里插入数据之前,我们必须要提前定义这个数据表的结构,规则数据表里的字段的名字与字段值的类型,插入数据的时候必须要按数据表的规定,在指定名字的字段里插入符合要求的数据。
这种模式就是 Schemafull,SurrealDB 除了支持这种传统的模式以外,它还支持使用 Schemaless ,也就是在往数据表里插入数据的时候,不需要提前定义这个数据表的结构。
可以先这样试一下,执行一段查询,INFO FOR DB; 显示当前这个数据库里有一个数据表,名字是 post。它是一个 schemaless 类型的数据表,也就是无结构的数据表。
user
在上面再执行一下 CREATE user 后面加上 CONTENT,然后是一个对象,里面添加一个 name 属性,值是 '李白'。在数据库的 user 数据表里添加一条数据记录,它里面有个 name 属性,这个属性可以看成是 user 数据表里的一个字段的名字,“李白”是一个字段串类型的数据。
再执行一下 SELECT * FROM user;
发送一下请求,这次你会发现,在 user 表里添加了数据记录以后,再次执行 INFO FOR DB 的时候,显示这个数据库里有一个 table,名字是 user。
这个 table 默认是 SCHEMALESS 类型的,也就是无结构的数据表。
DEFINE FIELD
在不确定数据表结构之前,我们可以使用这种 SCHEMALESS 模式的数据表,在数据表里有些字段需要规范一下,可以用 DEFINE FIELD 定义数据表里的字段。
DEFINE FIELD 定义字段,名字叫 name ,ON TABLE user,在 user 这个数据表定义一个 name 字段,用 TYPE 把这个字段的值的类型设置成 string。
然后可以用 ASSERT 再测试一下字段的值是否符合要求。ASSERT $value 这个 $value 就是字段的值,它不能等于 NONE,再用 AND 继续添加条件,用一下 string::length 这个函数,把 $value 交给它,这个 string::length 返回的就是字符串的长度,这个长度必须要大于 1。
这段声明的意思就是,在 user 数据表里定义一个 name 字段,它的值是 string,也就是字符串,字段的值不能是 none,并且字符长度必须大于 1 。
下面执行一下 INFO FOR TABLE user; 查看一下 user 数据表的相关信息。
发送一下请求,在返回的数据表信息里面,在 fd 属性里有个 name 字段,它的值就是这个字段的定义。
下面可以试一下创建一条 user 数据,数据是空白,发送请求,会得到一个异常响应。因为现在创建 user 数据的时候,name 字段必须得有值,并且字符长度要大于 1 。添加一个 name 属性,值是 “杜甫”。
发送请求,成功创建了一条 user 数据,这条数据里面有一个 name 属性。因为 user 数据表是 schmeless 数据表,所以可以任意往这个表里添加字段。
UPDATE ,更新一下这条 user 数据 ,给它添加一个 email 字段,值是 dufu@ninghao.net。执行一下,显示这条数据里有 name 还有 email 字段。
DEFINE TABLE
如果完全确定了数据表的结构,可以把这个表定义成 Schemafull。执行一下 DEFINE TABLE user SCHEMAFULL; 再执行 INFO FOR DB; 显示现在 user 这个数据表用的是 Schemafull 模式。
下面可以创建一条 user 数据记录,name 是“白居易”,email 是 “baijuyi@ninghao.net”。 发送一下请求,你会发现,刚才创建的这条数据记录里面只有一个 name 属性。
因为现在 user 这个数据表用的是 Schemafull 模式,在这个数据表里只定义了一个 name 字段,所以没有定义的字段都会被忽略掉。