如何使用 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 中设计数据集的结构,因为没有外键关系或表连接。
该应用程序具有三个表,users
、tweets
和 followers
。用户可以发布推文,也可以关注其他用户并查看他们推文的提要。尝试创建数据结构时出现问题,因为我不知道如何加入必要的表。例如,我将如何实现用户关注功能?
这是我用来给自己一个起点的 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)的关系数据库?的主要内容,如果未能解决你的问题,请参考以下文章