javascript - 如何将 Firebase 用作具有生成键(JS)的关系数据库?

标签 javascript json database firebase non-relational-database

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

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

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

ERD for app

因为我一直在努力思考整个 JSON 的事情,这是我能将它与关系数据库联系起来的最接近的方式,同时仍然使用 Firebase .push() 函数添加到数据库中的列表(从 Firebase 仪表板可以看出):

Firebase attempt

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

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

我是否应该尝试以某种方式使用 .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"
    }
}

让我知道是否还应该包含任何其他内容!

最佳答案

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

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

就引用 key 而言,通常最佳做法是使用生成的 ID,因为您可以保证它们是唯一的。

关于javascript - 如何将 Firebase 用作具有生成键(JS)的关系数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585221/

相关文章:

database - 创建现有数据库的 "skeleton"

javascript - 我的 Apollo 服务器的订阅不起作用 : Cannot read property 'headers' of undefined

javascript - 如何使用 Javascript 和 JQuery 修改位于 Bootstrap 模式中的按钮的外观?

javascript - EpicEditor 文本显示为而不是空格

json - underscore.js - 对象不支持此属性或方法 - ie8

c# - 如何检查变量是数组还是对象?

ruby - 显示用户购买时出现错误,显示他购买的产品时出现产品图片和标题错误

sql - 将 ASCII(子)集传输到表

javascript - 如果 jquery 饼图中的数据为零,则隐藏图例标签

php - 在 MySQL 中,通过对 JSON 列执行联接从两个表中获取数据时出现问题