12

假设我有两种对象用户和帐户。用户可以拥有多个帐户并与其他用户共享。所以 AccountA 可能对 User1 和 User2 可用。而 AccountB 仅对 User1 可用。所以 User1 有两个账户,User2 有一个账户。

构建这个的“firebase”方法是什么?

我最初的想法是每个用户都可以存储他们所属的一组帐户。

users: {
  1: {
    name: 'Ted',
    accounts: [1, 2]
  }
  2: {
    name: 'Frank',
    accounts: [1]
  }
}

accounts: {
  1: {
    name: "Checking"
  },
  2: {
    name: "Savings"
  }
}

或者该帐户将有一组用户。

users: {
  1: {
    name: 'Ted'
  }
  2: {
    name: 'Frank'
  }
}

accounts: {
  1: {
    name: "Checking",
    users: [1, 2]
  },
  2: {
    name: "Savings"
    users: [1]
  }
}

我想知道哪种方式可以让我轻松找到用户的帐户,以便当 Ted 登录时,我可以列出他所属的帐户,而无需拉下整个数据库。为了安全起见,无论如何我都不希望他机器上的所有数据。

问题 #1 安全规则会解决这个问题吗?我的意思是我打算设置我的安全规则,以便用户只能使用他们所属的帐户。我希望如果我查询“/accounts”,我只会取回用户可以访问的那些帐户......不是吗?

问题 #2 是否有查询项目列表的机制。像“/accounts/[1,2]”这样我拿回帐户“/accounts/1”和“/accounts/2”?

感谢您提供的任何信息。

4

1 回答 1

20

在进入细节之前,您需要记住以下几点:

  1. 您通常希望根据您的阅读模式来构建数据。因此,如果您需要查找用户所在的所有帐户,则需要将该列表存储在某处。如果您想查找与某个帐户关联的所有用户,您还需要将该列表存储在某处。所以关于问题 #2,Firebase 目前没有任何通用查询能力(如“/accounts[1,2]”),尽管这可能会在未来出现。
  2. 安全规则也不能用于查询数据。您可以读取某个位置的所有数据,也可以不读取。因此,关于您的问题 #1,安全规则不会自动为您查询 /accounts。
  3. 安全规则不允许您在数组的内容中搜索元素,但它们可以检查对象中是否存在键。因此,如果用户 1 和 4 可以访问某些内容,您可能希望存储 { 1: true, 4: true } 而不是 [1, 4]。

考虑到这一点,我建议像第一个示例一样存储数据,但不使用数组:

users: {
  1: {
    name: 'Ted',
    accounts: {
      1: true,
      2: true
    }
  }
  2: {
    name: 'Frank',
    accounts: {
      1: true
    }
  }
}

accounts: {
  1: {
    name: "Checking"
  },
  2: {
    name: "Savings"
  }
}

这将使您轻松获取特定用户的所有帐户。如果您还需要能够转向另一个方向(一个帐户的所有用户),您将必须复制该信息并将其也存储在帐户中。例如:

accounts: {
  1: {
    name: "Checking",
    users: {
      1: true,
      2: true
    }
  },
  2: {
    name: "Savings",
    users: {
      1: true
    }
  }
}

希望这可以帮助!

于 2013-07-02T16:54:11.867 回答