数据库概要

MongoDB

平台选用MongoDB作为后端持久化数据库。MongoDB是表结构灵活的文档型NoSQL数据库,可以直接存储JSON。

_id

每条记录都有一个唯一ID,即_id
它是24位的16进制字符串,可以用isOID()来判断一个字符串是否是有效ID。
它前8位代表创建该记录时的时间(精确到秒),可以用date()_id转换成时间。还可以用OID()通过一个时间来构建符合格式的_id,以此来搜索数据库。

Redis

平台选用Redis数据库自动缓存从MongoDB获取的/更新的单条记录,但由search/count/aggregate/distinct得到的多条记录则由开发者决定是否需要缓存即缓存时间。
通过缓存可以加快数据库查询返回的速度,但如果查询条件里包含了即时变化的变量,比如当前时间,那启用缓存就没有意义了。

集合/表

在数据库中有5个供用户直接使用的集合(collection),即常说的表:
product 产品表
user 用户表
resource 资源表,存放用户上传的图片、视频、文件
order 订单表
xdb 通用表,不能归类到上表的才存入此表

使用这些表时我们都以$打头,比如用$product.get("6008d3321753d436f8c9538c")$product.get("db_intr")来获取正在阅读的这篇文档。

特例

$me:当用户在user表操作自己的用户信息时,我们使用$me可以使操作更加便捷。
$xtk:同样的道理,由于xdb表必然有typekey两个字段,我们可以据此用$xtk直接操作xdb表而避免使用难记的_id

操作

每个表通常都有如下操作
create、get、modify、delete、search、count、aggregate、distinct
每个表有自己的个性操作,请查询相关文档。

$c

数据库操作返回的数据都会放入$c对应的表名下面,比如通过$c.product[_id].x.title可以拿到标题。
第一个参数是path的API会把返回结果放入$c.x指定的path下,search返回的arr是指搜到的数组,平台会把多次的搜索得到的数组合并到all里。
特别地,当前用户数据除了放入$c.user还会放入$c.me
同理,xdb的数据也会根据其type和key放入$c.xtk中。
在编辑模式下我们可以在开发者工具的控制台上用log($c)把所有数据打印出来。

新的数据库操作会影响原先获得的数据:
get、modify、search返回的数据会合并到对应的旧数据中。例如$proudct.modify(_id, {…})会更新$c.proudct[_id],如果先前做过搜索$proudct.search(“A.B”, {…})那也会更新$c.x.A.B.arr和$c.x.A.B.all里对应的数据。
delete会删除对应的旧数据,也会删除search返回数组中的对应数据。比如先搜索然后马上把返回的数组依次删除:$c.x[path].arr.forEach(‘$proudct.delete($x._id)’)会有不稳定问题,因为每删除一次都会删除数组里的对应数据项从而改变数组长度,把数组先克隆再循环就没问题了:$c.x[path].arr.clone().forEach(‘$proudct.delete($x._id)’)。

数据安全控制

对于一个严肃的应用,加强数据安全控制是值得高度重视的。虽然在每个应用在创建时都预设了基础安全控制,但还是远远不够的。请到专门的文档中学习

缓存

接口调用需要花费时间、网络、服务器和数据库资源,平台是据此来收取流量费的,我们应尽量减少接口调用的次数和频次,不做无谓的消耗。
在服务器端平台会自动缓存从数据库获取的资源,在浏览器端平台会自动缓存从服务器获取的资源,以最大限度节省流量费。当一个接口已被缓存时平台将直接从缓存读取而跳过接口调用,如果想再次获取最新数据可以传入always参数。
一个接口请求发出去需要一段数据才能从服务器端返回来,所以应该避免在极短的时间内多次触发完全相同的接口(接口名、参数数量和参数值都相同)。为此平台会自动跳过3秒内触发的完全相同的接口,而等待最近触发的接口返回后才继续执行后续表达式。

数据库管理插件

每个应用在创建时都默认在db_admin页安装了一个数据库管理的插件(zp109),插件里集成了各表的基本操作。

Make in ZC APP Platform