【问题标题】:Organize Firebase database for multiinstance app为多实例应用组织 Firebase 数据库
【发布时间】:2023-03-09 17:05:01
【问题描述】:

我是 firebase 新手,我正在测试它是否适合我的下一个项目。作为我项目的简化示例,我将给出一个 TODO 列表。我希望不同的客户使用电子邮件和密码登录,并在登录后获得仅访问他们的数据库部分。之后,每个客户都应该能够创建具有不同权限的应用程序部分的用户。例如,客户是一个家庭。他们使用我的 todo 应用程序。父亲有管理员权限,儿子只能阅读按摩等。另一个帐户是不同的家庭等等。所以每个帐户都应该有整个三个节点的副本。我应该是多实例应用程序之类的东西。客户端不会共享任何数据所以我不认为将所有相似的数据放在一个表中是个好主意。所以我认为关于 shema :

    account1
        users
         user 1
           name : John
           type : Admin
         user 2
           name: Ben
           type: User
       todolist
          massages
            1
              author : John
            2
              author : Ben
       appsettings
            1
             some settings
...... more nodes


-----------------------------------

account2
     users
       user1
         name : Jen
         type : users
       user2
         name : Sam
      todolist
        massages
          1
            author : Jen
.....same tables like account1

这是构建数据库的正确方法吗?组织登录过程的正确方法是什么?帐户所有者应该使用电子邮件和密码登录,然后每个用户都应该有一些密码才能根据他在帐户 - 设置节点中的设置获得访问权限。

【问题讨论】:

    标签: firebase


    【解决方案1】:

    这是一个很好的问题,但有一些问题需要解决,这将有助于澄清问题和答案。

    Firebase 没有表格。它是一个带有节点的 JSON 数据结构;父母和孩子本身(这是概念性的)

    app_node
      parent_node_1
        child_node_1
          child_of_child_node_1
        child_node_2
          child_of_child_node_2
      parent_node_2
        child_node_1
        etc
    

    这意味着您的所有应用数据都存在于单个应用节点中 - 因此除了将所有应用数据存储在该空间中之外别无选择。但是,有一些方法可以使其保持数据“分离”。

    暂时假设 parent_node_1 是 a_family,而 parent_node_2 是 b_family。

    防止a_family访问b_family数据的方法是通过规则。您设置了规则,以便 a_family 的用户只能读取/写入数据到 a_family 节点。

    (概念上)

    .read
       authentication = true and this user is a member of a_family
    .write
       authentication = true and this user is a member of a_family
    

    实际上是这样的:

    "$user_id": {
      ".read": "auth != null && $user_id == auth.id && $user_id exists in node a_family/users"
    

    用户只能从属于他们家族的节点读取/写入,因此路径 $user_id 将等于他们的 auth.id

    在您希望为数据提供完全独立空间的应用设计中存在挑战,但 Firebase 提供了一些新工具,可以“更轻松”地为这些情况制定规则。

    您应该查看 Firebase Security and Rules 部分和有关 Bolt 编译器信息的特别说明。

    【讨论】:

    • 如果我使用 SQL 数据库,我会为每个客户端构建不同的数据库。让我们想象它会是一些库存管理软件或其他东西。每个客户端都是独立的。在 firebase 世界中,我想我可以使用不同的根节点对于每个客户端,在此节点下将有应用程序运行所需的子节点。这可能吗。我想我会尝试构建一些东西并进行测试,但我需要听取一些建议。我可以为每个客户端获取根的 ID,以便他们可以在此根下使用具有 xxxxxx.firebaseapp.com/accoun1 之类地址的应用程序结构类似。
    • 在 SQL 中,你是对的。然而,这是 NoSQL,因此没有为每个客户端设置不同根节点的选项。正如我在回答中提到的,您可以拥有 your_app.firebase.com/account1 和 your_app.firebase.com/account2,然后利用规则将 account1 的用户保留在 account1 节点中。
    • 作为后续,我鼓励您探索 Firebase,因为它的功能和性能非常适合此类应用程序。但是,拥有谨慎、分离的数据并不是 Firebase 的强项,因此您必须相应地对其进行编码并依赖规则(大量)使其工作。我曾向 Firebase 团队建议,为用户和数据提供某种组结构将真正让 Firebase 进入一个全新的应用开发领域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2018-09-20
    • 1970-01-01
    • 2020-08-24
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多