Firebase - 一对多关系&查询

时间:2017-02-11 18:53:29

标签: javascript firebase firebase-realtime-database

自从听说Firebase以来已经有一段时间了,我上周决定开始一个小项目。

我已经阅读了很多关于数据库结构的文章,我为我的数据库提出了两个解决方案:

案例1

B 通过 ownerId 引用表 A

中的记录
{
    "A" : {
        "user-id-1" : {
            "name": "James",
            "number": "11111"
        },
        "user-id-2" : {
            "name": "Rob",
            "number": "11111"
        },
        ...
    },

    "B" : {
        "id-b-1" : {
            "something": "value1",
            "ownerId" : {
                "user-id-1": true 
            }
        },
        "id-b-2" : {
            "something": "value2",
            "ownerId" : {
                "user-id-2": true 
            }
        },
        "id-b-3" : {
            "something": "value3",
            "ownerId" : {
                "user-id-2": true 
            }
        },
        "id-b-4" : {
            "something": "value4",
            "ownerId" : {
                "user-id-1": true 
            }
        },
        ...
    }
}

案例2

A 通过 Bs 数组引用表 B

中的记录
{
    "A" : {
        "user-id-1" : {
            "name": "James",
            "number": "11111"
            "Bs": {
                "id-b-1": true,
                "id-b-4": true,
                "id-b-7": true,
            }
        },
        "user-id-2" : {
            "name": "Rob",
            "number": "11111"
            "Bs": {
                "id-b-2": true,
                "id-b-3": true,
                "id-b-6": true,
            }
        },
        ...
    },

    "B" : {
        "id-b-1" : {
            "something": "value1",
        },
        "id-b-2" : {
            "something": "value2",
        },
        "id-b-3" : {
            "something": "value3",
        },
        "id-b-4" : {
            "something": "value4",
        },
        ...
    }
}

在表格 A 中,记录的ID与登录用户 user-id-1 的ID相同,因为我无法添加firebase提供的用户对象的更多属性。

我想说A和B之间相关的记录可以增长到数千条记录。

因此 A B 之间存在一对多的关系。

我想说要检索与 user-id-1 相关的所有 Bs

  1. 根据您的经验,哪种数据库结构在这种情况下更好?
  2. 如何通过在数据库上只运行一个查询来检索所有 Bs 对象?
  3. 我可以使用某种 where 子句,它允许我通过查看 ownerId 值来过滤 Bs 吗?
  4. 提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

你的结构似乎在描述一个"多对多"关系,但在不同的方面。因为"案例1" ownerId可以包含多个id:

"ownerId": 
{
    "user-id-1": true, 
    "user-id-1": true 
}

和"案例2"两个" Bs"可以包含相同的Id:

"user-id-1" : {
       "name": "James",
       "Bs": {
           "id-b-1": true
       }
   },
   "user-id-2" : {
       "name": "Rob",
       "Bs": {
           "id-b-1": true
       }
   }

在这两种情况下,你都有一个" A"拥有多个" Bs"和一个" B"由多个" As"。

拥有

为了使这一对多,我建议使用"案例1"并将对象更改为

"id-b-4" : {
    "something": "value4",
    "ownerId" :  "user-id-1"
}

这将只允许该项目的一个所有者。 在"案例2"没有什么可以强制执行独特的" Bs"对于每个" A"。它也会使查询变得困难。

所有这一切,我认为这两种情况都是可行的,这取决于你如何使用这些对象,因为Firebase的卖点是你应该选择与你的用例更相关的实时数据。如果您正在观察" As"选择了案例2.如果你正在观察" Bs"选择"案例1"。或者你可以使用两者,无论是什么让你的生活更轻松。