apicloud apicloud

注册
查看: 10576|回复: 35

[APP开发技巧] 小谈pointer和relation

 

主题:
4
帖子:
11
云币:
85

[APP开发技巧] 小谈pointer和relation

 
10576 35 | 发表于 2015-6-22 21:44:28 |阅读模式 | |
在apicloud的数据库中,pointer和relation是在很难让人理解。
通过不断的实践,终于有点明白了。

pointer和relation作用:在nosql数据库中实现表之间的关联

首先来说说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的行出现了:
"user(uz*R*id)" : "5587d38d8dd3919a41d5b42e"

由此可知,与relation相关的数据是保留在被relation的表中的。
我甚至试过删除user的order属性,然后重新创建关联到order表的relation类型
此时,不需要任何额外的操作,我就实现了之前创建的关联。

知道了这些,就可以解决“无法让user表中的order属性关联到已经存在的行”的问题了
解决这个问题的方法,就是在order表中添加被user关联的属性:
  1. "user(uz*R*id)" : "5587d38d8dd3919a41d5b42e"
复制代码
如果是使用控制台修改数据库的话,就需要使用API 调试功能,在order表更新该属性。

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

提示:遇到pointer和relation相关的问题,可以通过控制台导出数据库中的表,分析和解决问题




3

查看全部评分

主题:
203
帖子:
547
云币:
675
发表于 2015-7-4 10:42:31 |
写到很清楚  官方应该有这样的文档才好  如果有案例代码 更直观了

新手上路

UID:41214

主题:
20
帖子:
113
云币:
332
发表于 2016-1-18 15:13:52 |
这个说法形象的说就是在你建立user与order之间的relation关系时,如果你通过后台在order表里输入数据,点user关联relation时,你查看不到你添加的数据,只有通过user的关联relation属性到order表添加的数据,才能通过user表的relation关联看到你添加的数据!也就是数据是单向关联:user--->order

主题:
9
帖子:
36
云币:
103
发表于 2015-6-23 08:14:58 来自手机 |
顶一下,表名支持态度!

业余车手

UID:22414

主题:
8
帖子:
815
云币:
12667

版主勋章APICloud粉丝

发表于 2015-6-23 15:08:15 |
感谢分享

新手上路

UID:46618

主题:
2
帖子:
37
云币:
615
发表于 2015-7-4 11:04:44 来自手机 |
学习了,,,

主题:
6
帖子:
36
云币:
79
发表于 2015-7-8 17:05:53 |
非常好的帖子,这个一定要顶一下

主题:
5
帖子:
18
云币:
29
发表于 2015-7-20 17:59:51 |
不错的帖子。

主题:
61
帖子:
159
云币:
244
发表于 2015-7-20 20:43:47 |
还是不甚明白。。。

主题:
27
帖子:
74
云币:
164
发表于 2015-7-20 22:23:38 |
收藏先。

主题:
0
帖子:
10
云币:
13
发表于 2015-7-20 23:44:52 |
学习了。。。。。
1234下一页
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表