使用Firebase的多对多

Rya*_*ery 12 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

或者帐户将有一组用户.

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

accounts: {
  1: {
    name: "Checking",
    users: [1, 2]
  },
  2: {
    name: "Savings"
    users: [1]
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

问题#2是否有查询项目列表的机制.像"/ accounts/[1,2]",以便我收回帐户"/ accounts/1"和"/ accounts/2"?

感谢您分享的任何信息.

Mic*_*uer 20

在详细介绍细节之前,您需要记住以下几点:

  1. 您通常希望根据阅读模式构建数据.因此,如果您需要查找用户所在的所有帐户,您需要将该列表存储在某处.如果您想查找与帐户关联的所有用户,您还需要将该列表存储在某个位置.因此,对于问题#2,Firebase目前没有任何通用的查询功能(例如"/ accounts [1,2]"),尽管这可能会在将来出现.
  2. 安全规则也不能用于查询数据.您可以被允许读取某个位置的所有数据,也可以不读取任何数据.因此,关于您的问题#1,安全规则不会自动为您查询/帐户.
  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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

accounts: {
  1: {
    name: "Checking",
    users: {
      1: true,
      2: true
    }
  },
  2: {
    name: "Savings",
    users: {
      1: true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 您能指定如何提出请求吗?如果你只有你对特定用户的firebase引用.您如何获得有关其帐户的信息 (3认同)
  • @feresr你需要多个请求 - 第一个获取帐户列表(/ users/1/accounts),然后是你感兴趣的每个帐户一个(到/ accounts/n).这就是为什么有时值得在/ users/x/accounts/y下保留一些摘要信息,例如帐户昵称. (2认同)