使用Firebase的多对多

时间:2013-07-02 01:22:13

标签: firebase firebase-security

假设我有两种对象用户和帐户。用户可以拥有多个帐户并与其他用户共享。因此Account1可能对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”?

感谢您分享的任何信息。

1 个答案:

答案 0 :(得分:20)

在详细说明之前,您需要记住以下几点:

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

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

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

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

    希望这有帮助!