Bmob数据库说明

列类型

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与Relation的区别

  首先来说说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。

  小结:

  1. pointer实现建立表与表之间一对一的关系,实际上是表中一行与另一表中的一行之间的关系。
  2. pointer建立的关系是单向的,只有含pointer属性的表能访问被关联的表。
  3. 可以通过在两张表中都建立pointer,实现两张表之间的双向关联。
  4. 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的行出现了:

  由此可知,与relation相关的数据是保留在被relation的表中的。

  我甚至试过删除user的order属性,然后重新创建关联到order表的relation类型

  此时,不需要任何额外的操作,我就实现了之前创建的关联。

  知道了这些,就可以解决“无法让user表中的order属性关联到已经存在的行”的问题了

  解决这个问题的方法,就是在order表中添加被user关联的属性:

  复制代码

  如果是使用控制台修改数据库的话,就需要使用API 调试功能,在order表更新该属性。

  小结:

  1. relation 建立表中一行与另一表中的多行之间的关系
  2. 同pointer一样,也是单向关联
  3. 同pointer一样,可以通过在两个表都建立relation实现双向关联
  4. 同pointer一样,relation建立关联的表,由创建列的时候的target class决定
  5. relation两张表之间的关联信息实际上保存在被关联的表中
  6. 控制台中无法直接设置relation关联已存在的行

列属性

唯一键
值相同的行将会被删除

客户端不可见
数据不能被客户端看到


demo数据库说明

用户表
用户表

日志表
日志表

反馈表
反馈表

心邮数据库说明

用户表
用户表

状态表
状态表

评论表
评论表

发表评论