如何使用 Firebase 作为具有生成密钥(JS)的关系数据库?

Posted

技术标签:

【中文标题】如何使用 Firebase 作为具有生成密钥(JS)的关系数据库?【英文标题】:How to use Firebase as a relational database with generated keys (JS)? 【发布时间】:2016-08-03 18:30:35 【问题描述】:

我正在开发一个使用 Firebase 作为后端存储机制 (JSON) 的简单 javascript Twitter 克隆。我熟悉关系数据库 (SQL),但不熟悉非关系数据库。我目前正在尝试研究如何在 Firebase 中设计数据集的结构,因为没有外键关系或表连接。

该应用程序具有三个表,userstweetsfollowers。用户可以发布推文,也可以关注其他用户并查看他们推文的提要。尝试创建数据结构时出现问题,因为我不知道如何加入必要的表。例如,我将如何实现用户关注功能?

这是我用来给自己一个起点的 ERD:

由于我一直试图围绕整个 JSON 事物展开思考,这是我可以将其与关系数据库关联起来的最接近的方法,同时仍使用 Firebase .push() 函数将其添加到数据库中的列表中(从 Firebase 仪表板可以看出):

我看到一些人试图通过“去规范化”数据来解决这个问题,理由是 Firebase 没有任何查询机制。但是,这些文章主要是在 2014 年之前,也就是 Firebase 确实添加查询的时候。话虽如此,我不明白使用查询对我有什么帮助,而且我认为我被生成的密钥卡住了。

我应该如何最好地构建我的数据以使用 Firebase JSON 列表?我已经阅读了他们的一些文档,但无法找到使用我正在寻找的内容和生成的密钥的任何内容。

我是否应该尝试以某种方式使用.set() 方法,并使用电子邮件地址作为用户的“主键”而不是生成的密钥? [如下所述,这是我计划避免的。谢谢@metame]

更新

这是否是我应该更关注的数据结构?然后按键查询?

users: 
    Hj83Kd83: 
        username: "test",
        password: "2K44Djl3",
        email: "a@b.c"
    ,
    J3kk0dK4: 
        username: "another",
        password: "33kj4l5K",
        email: "d@e.f"
    


tweets: 
    Jkk3ld92: 
        userkey: "Hj83Kd83",
        message: "Test message here!"
    ,
    K3Ljdi94: 
        userkey: "J3kk0dK4",
        message: "Another message here!"
    


followers: 
    Lk3jdke9: 
        userkey: "Hj83Kd83",
        followerkey: "J3kk0dK4"
    

如果我应该包含其他内容,请告诉我!

【问题讨论】:

我推荐阅读这个answer to someone trying to do something similar、这个answer to a simple NoSQL data modeling question和这个article explaining common NoSQL data modeling techniques。 有关 Firebase twitter 克隆的有趣示例,请查看 firefeed.io。由于它是由 Firebase 工程师制作的,因此在涉及到 NoSQL 数据建模时,它必然会包含许多他们对良好实践的想法。 那么看firefeed.io,说一些查询可以通过使用规则来避免是正确的吗?例如,与其尝试通过帖子查询应该更新谁,而是依靠规则仅更新关注者? 该规则可用于确保您的应用程序代码只能更新关注者。它不做实际的更新(只有代码可以做,安全规则不是代码),但它可以用来确保只允许有效的更新。请注意,在您尝试在 Firebase 中对数据进行实际建模、编写一些安全规则、编写一些代码并确保一切按您期望的方式运行之前,所有这些都不会开始有意义。 【参考方案1】:

一般来说,在非关系或 noSQL 数据库中表示关系可以通过嵌入文档(行的 noSQL 措辞)或通过文档引用来解决,就像您在示例解决方案中所做的那样。

MongoDB 网站有一些不错的文章,主要适用于所有非关系数据库,包括 Model One-to-Many Relationships with Document References,我认为这与您的问题最相关。

就引用键而言,最好使用生成的 ID,因为您可以确保它们是唯一的。

【讨论】:

谢谢,我其实没想到那里看。但是,我确实访问了该链接,并认为它更有意义。我在问题中发布了一些示例列表的更新,我在正确的轨道上吗?我担心 Firebase Web API 可能无法很好地尝试查询这个,因为他们的页面提到了去中心化并且看起来相当不同。虽然也许那只是我?

以上是关于如何使用 Firebase 作为具有生成密钥(JS)的关系数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何对firebase自动生成的密钥进行排序?

如何在Firebase中搜索孩子的值

如何让 push() 密钥生成我的 Firebase?

使用生成的密钥插入 Firebase

使用为每个用户生成的唯一密钥限制 Firebase 数据库规则。 (安卓工作室)

如何从 Firebase 中的第二个生成的密钥获取数据?