String
文本类型全部用 String
类型表示
Number
数字类型,可以选择是否自增和自增值。
Boolean
bool类型
Date
日期时间类型
File
文件类型
Geopoint
表示一个地理位置的坐标,存放经纬度
Array
长度可变的数组对象,里面可以放各种类型的东西,是一个有序的集合
Object
一个无序的集合,类似 C++ 中的 map 、C# 中的 hashtable、Java 中的 hashmap 这样一个结构。并且包含了一个 JavaScript 语言系统赋予的原始值,什么意思呢? Object 有个方法叫做 valueOf ,它的功能是返回指定对象的原始值。这个也是可以在 Script56 中查到的,并且还有一个表格列举了系统对象的 valueOf 返回结果。也就是说,Array、Boolean、Date、Function、Number等等对象,其实都是从 Object 来的,它们的祖先都是 Object 。它们表现不同的语言特性,比如 Array 有被自动管理的 length 属性, Boolean 只有 true 或 false 取值, Date 表示时间结构, Function 可以被运行,都是它们的原始类型(valueOf)赋予它们的能力。 Object 实际只是一个概念, JavaScript 这个语言基于对象,是说所有内建类型都被抽象出了一组公用的方法和属性(也可以叫行为和状态),我们就想像只拥有这些特性的一个东西就是 Object 。实际上 Object 在编程中没有太大用处,我们都是在使用 Object 的实例 object ,然后使用 Object 的集合特性( expando ),扩充 object 成为我们希望的东西。对于 Object.prototype ,其实并不怎么能用到,因为每个确切的类型都有自己的 prototype ,我们添加原形方法大都针对确定的类型。 Object 与 Array 的区别可以参考该网页。
Pointer
指针类型,存放变量地址,间接引用一个变量,使用 pointers 可以存储一对一的关系。每个 pointer 有对应的关联列。
Relation
Relation 也可以存储一对多的关系,如果关系「多」方包含的对象数量大于 100 左右,那么就必须使用 Pointers。反之,如果对象数量低于 100 或更少,那么 Relation 可能会更方便,特别是在获取父对象的同时得到所有相关的对象,即一对多关系中的「多」。需要填写关联列
Pointer 类型和 Relation 类型可以参见leancloud的数据模型文档。他们的区别可以参见该链接,写的非常详细。
首先来说说pointer
官方文档上说“pointer用于表与表之间建立一对一的关系”,太粗糙了。
要理解pointer,最好从pointer的使用方法开始
如果我要在user的基础上增加钱包属性,我可以直接创建一个新的列wallet,数值类型。
可是,如果这么做的话,我的wallet只能存放一个值。
如果我需要我的钱包有 总金额、冻结金额 和 代金券 三个属性的话,上面的表是不满足我的需求的。
这时,我可以使用pointer,用pointer指向一个新的表wallet。
当然,我也可以选择其他方法,例如创建一个array类型的wallet,或者是object类型的wallet。
如何使用pointer?
- 首先,在user中添加新列,poiner类型,名称为wallet,目标class为新建的wallet表。
- 然后,我就可以通过pointer来实现user到wallet的关联了。
- 例如,有个user,名jack,在wallet中创建了jack的钱包
- 这时,我只需要将jack的钱包的id(apicloud数据库中,每一张表的每一行都有一个id)输入到user表中jack的pointer属性,就可以实现jack与其钱包的关联
- 可是,这时还无法从jack的钱包找到jack。
小结:
- pointer实现建立表与表之间一对一的关系,实际上是表中一行与另一表中的一行之间的关系。
- pointer建立的关系是单向的,只有含pointer属性的表能访问被关联的表。
- 可以通过在两张表中都建立pointer,实现两张表之间的双向关联。
- pointer关联的表,由创建列的时候的target class决定,不能指向别的表的行。
接下来谈谈relation
官方文档:“relation是指这张表的这个字段指向另一张表中的某几个行的集合,用于表与表之间建立一对多的关系”
有了pointer的知识,就能猜到relation实际上是 建立表中一行与另一表中的多行之间的关系
举个实例,我要实现user下单购物,这时就需要使用relation,首先需要有个下单的order表,然后在user表中建立relation类型的order属性,targetclass为order表
这时只要不断往user的order属性中添加order表中的id就可以了(错错错,大错特错!)
问题出现了,我无法在user的order属性中添加order表中的id
直接在apicloud的控制台操作数据库时,当我点击user表的order属性,就会直接跳到order表,而且是空的表,我之前添加的行都看不见了
这时,虽然我可以建立新的行,但是我无法让user表中的order属性关联到已经存在的行。
通过观察导出的数据库的表,我发现 虽然relation属性是在user表中创建的,可是实际上记录着relation关系的却是order表。
在导出user表中,没有发现order属性(relation),甚至是在添加relation类型前后,导出的表竟是相同的。
而在order表中,被relation的行出现了:
1 2 |
"user(uz*R*id)" : "5587d38d8dd3919a41d5b42e" |
由此可知,与relation相关的数据是保留在被relation的表中的。
我甚至试过删除user的order属性,然后重新创建关联到order表的relation类型
此时,不需要任何额外的操作,我就实现了之前创建的关联。
知道了这些,就可以解决“无法让user表中的order属性关联到已经存在的行”的问题了
解决这个问题的方法,就是在order表中添加被user关联的属性:
1 2 |
"user(uz*R*id)" : "5587d38d8dd3919a41d5b42e" |
复制代码
如果是使用控制台修改数据库的话,就需要使用API 调试功能,在order表更新该属性。
小结:
- relation 建立表中一行与另一表中的多行之间的关系
- 同pointer一样,也是单向关联
- 同pointer一样,可以通过在两个表都建立relation实现双向关联
- 同pointer一样,relation建立关联的表,由创建列的时候的target class决定
- relation两张表之间的关联信息实际上保存在被关联的表中
- 控制台中无法直接设置relation关联已存在的行
唯一键
值相同的行将会被删除
客户端不可见
数据不能被客户端看到