【问题标题】:Firebase database schemaFirebase 数据库架构
【发布时间】:2017-01-03 23:39:19
【问题描述】:

我无法理解 Firebase db 的工作方式。 是的,我知道它是我的数据的 JSON,我知道在不同对象之间设置一对多和多对多关系的方法。但是有什么方法可以为数据库设置某种“schema”?

一个例子来理解我的意思:如果我正在使用 Firebase SDK 创建一个 Android 应用程序,而我的朋友正在创建一个 iOS 应用程序。我把这个推到"users": {name: John, city: LA}。我的朋友犯了一个错误,推{name: Tom, cety: NY}。比,试图得到汤姆斯市 - 我会得到什么?空?

有没有办法指定保存数据的结构。在 Firebase 控制台中,我只看到了添加精确值的方法,而不是指定它的结构方式。如何告诉其他开发人员或“未来的我”我的用户应该包含,例如“name”、“gender”和“dog_eyes_color”? 希望你能理解我。

【问题讨论】:

  • 您可以使用所谓的安全规则验证 Firebase 服务器上的数据结构。请参阅firebase.google.com/docs/database/security/securing-data,然后特别是其中的.validate 规则。
  • @FrankvanPuffelen “.validate”规则看起来正是我所需要的。
  • @FrankvanPuffelen 还有一件事。您在第一次授权用户时说 - firebase 在数据库中创建所需的记录。数据库的根目录下是否有某种保留的“用户”节点?如果是这样 - 我如何指定用户的 ID,例如他们的用户名或电子邮件。如果我只想在用户提供一些有价值的数据的情况下在数据库中创建一个新的记录怎么办。示例:约会应用程序。只有在用户指定了性别、城市和他正在寻找的人时才注册用户。
  • Firebase 不会在数据库中为用户自动创建记录(让我知道您从哪里得到这个想法,我会更新它)。要创建这样的记录,您必须编写代码。这也意味着您可以准确控制创建记录的时间。

标签: firebase firebase-realtime-database nosql


【解决方案1】:

为了回答您的问题,Firebase 是一个无架构数据库。如果将数据推送到节点

users
  uid_0
    name: John
    city: LA

你的朋友又添加了一个用户

  uid_1
    name: Frank
    cety: NY

那么你的用户节点将有两个用户,他们的孩子有不同的键;城市与城市。

正如弗兰克在他的评论中提到的,您可以“捕获”并防止将数据写入无效的节点。然而,思考一下这门课:

class User {
   userId = ""
   name = ""
   city = ""

   func saveToFirebase() {
      myRef.setValue( user id etc etc)
   }
}

并且您告诉您的朋友,只要他们想在 Firebase 中存储用户,就可以使用该类。您现在拥有一个可以与 Firebase 交互的标准化模型。该类(或结构或您使用的任何东西)定义了要使用的架构。

Firebase 数据库 (NoSQL) 提供了一种存储和检索机制 以表格关系以外的方式建模的数据 用于关系数据库

作为对用户问题的跟进:Firebase 确实将用户身份验证数据存储在“后端”,开发人员无法直接访问(可查询)这些数据。这里的想法是,当使用诸如 createUser() 之类的 Firebase 函数在 Firebase 中创建用户时,您会在创建该用户时获得该用户的用户 ID (UID),这就是您可以用来在 /users 中存储其他信息的内容您创建的节点。

users
   uid_0
    name: Frank
    location: LA
    fav_food: Pizza
   uid_1
    name: Leroy
    location: NY
    fav_food: Tacos

.验证.... 我不会利用 .validate 规则来定义结构(模式)或控制其他开发人员。从长远来看,提供诸如上述用户类之类的编码工具将提供更大的灵活性和更少的麻烦(和编码),并且更易于维护。

【讨论】:

  • 你提到了一点,。您现在拥有一个可以与 Firebase 交互的标准化模型。该类(或结构或您使用的任何内容)定义了要使用的架构。但是您可以共享一个链接,以创建和定义一个定义了类的 shcema,我没有看到任何这样的链接。如果可能,请提供包含烧瓶和 firebase 架构文档的链接。
  • @RohanDevaki 我可以提供帮助,但我不确定我是否理解您的问题。你问 你能不能分享一个链接来创建和定义一个 shcema 但我的问题是 Firebase 是一个无模式数据库 所以没有模式。代码中的类为您的数据提供结构。如果您使用 Firestore,您可以直接填充 Class 对象,如文档 Custom Objects 中的此示例所示
【解决方案2】:

这种实现方式怎么样

class User {
  constructor(name, city) {
    this.name = name;
    this.city = city;
    return {
      name: this.name,
      city: this.city,
    };
  }
}

const saveDocument = function (collectionName, obj) {
  db.collection(collectionName)
    .add(obj)
    .then((docRef) => {
      console.log("Document written with ID: ", docRef.id);
    })
    .catch((error) => {
      console.error("Error adding document: ", error);
    });
};



saveDocument("user", new User("Jhon", "NY"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多