title: 如何提高数据查询的效率?

tag:实时数据同步

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

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

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

  1. {
  2. "users": {
  3. "Chen": { "name": "Mary Chen" },
  4. "Rinchen": { "name": "Byambyn Rinchen" },
  5. "Madi": { "name": "Hamadi Madi" }
  6. },
  7. "rooms": {
  8. "room1": {
  9. "name": "Alpha Tango",
  10. "members": {
  11. "user1": "mchen",
  12. "user2": "brinchen",
  13. "user3": "hamadi"
  14. }
  15. },
  16. "room2": { ... },
  17. "room3": { ... }
  18. }
  19. }

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

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

  1. {
  2. "users": {
  3. "Chen": {
  4. "name": "Mary Chen",
  5. // 在Mary的数据下,建立他所属 room 的索引。
  6. "rooms": {
  7. "room1": true,
  8. "room2": true
  9. }
  10. },
  11. ...
  12. },
  13. "rooms": { ... }
  14. }

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

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