跳转到内容

query

title: 如何提高数据查询的效率? tag:实时数据同步

Section titled “title: 如何提高数据查询的效率? tag:实时数据同步”

首先需要理解 Wilddog Sync 数据结构类似 NoSQL 类型,数据以 JSON 为格式进行存储。没有传统关系型数据库中的表和记录等概念。

所以在设计数据结构时,可以添加必要的冗余,以提高查询的效率。

例如,你需要设计一个聊天室的数据结构,该结构包含两个对象: user 和 room。两者是双向关系: user 可以属于多个room,room 可以包含多个user 。

{
"users": {
"Chen": { "name": "Mary Chen" },
"Rinchen": { "name": "Byambyn Rinchen" },
"Madi": { "name": "Hamadi Madi" }
},
"rooms": {
"room1": {
"name": "Alpha Tango",
"members": {
"user1": "mchen",
"user2": "brinchen",
"user3": "hamadi"
}
},
"room2": { ... },
"room3": { ... }
}
}

如上设计,当 user 需要查询自己属于哪个 room 时,该数据结构会遍历所有的 room,效率极低。更严重的是,如果 user 没有权限查看所有的 room,就不能实现需求。

正确的做法如下,在 user 下存入所属 room 的信息:

{
"users": {
"Chen": {
"name": "Mary Chen",
// 在Mary的数据下,建立他所属 room 的索引。
"rooms": {
"room1": true,
"room2": true
}
},
...
},
"rooms": { ... }
}

这样只需要读取/users/Chen/rooms/$room_id,看它是否为 null 就可以了。

但这样做需要注意,如果 user 和 room 的关系发生变化,就需要更新两个地方的数据。