【问题标题】:Google Firebase concerns and mixing database technologies in a web applicationGoogle Firebase 关注和在 Web 应用程序中混合数据库技术
【发布时间】:2019-04-26 11:07:30
【问题描述】:

您好,我正在与一家正在构建 Web 应用程序的小型初创公司合作。我们最初选择的技术栈是一个 React JS 前端,服务器端的 Python 处理一些外部数据请求,谷歌的 Fire-base(实时数据库)作为后端。

我们专门研究了 Firebase,因为 Google 工具套件的文档插件包括 google 分析和大查询,以及随 Google Firebase 仪表板一起提供的已经提供的用户身份验证。

然而,自从与一群开发人员接触后,他们在将 Firebase 与我们的应用程序结合使用时,在两个方面提出了担忧。 Firebase 已记录其支持的搜索深度和复杂性的限制。

对于需要跨表进行复杂连接的查询或部分搜索条件或需要返回相似或 LIKE 的查询,Firebase 被认为要么没有能力,要么能力非常有限。

关于用户,据说该产品在构建需要用户组和角色的环境时功能有限。

因此建议我们考虑远离 Firebase。或者,我们考虑将 Firebase 的使用减少到应用环境的更简单元素,将通过复杂搜索/数据查询找到和显示的关键数据和数据转移到对数据和搜索复杂性有更大支持的替代数据库技术上。

为此,我希望了解其他人是否在两个 Firebase 数据库产品(实时数据库或 FireServe)中的任何一个中都拥有他们的整个 Web 应用程序后端,以及您是否遇到任何关于性能、缺乏功能的问题,在尝试在后端执行复杂的事情时缺乏能力。

如果你这样做了,你是如何解决问题的。您是否使用第三方插件添加到 Firebase,是否将部分或全部数据从 Firebase 移至其他数据库技术,或者完全从 Firebase 中移出?

最后我想知道是否以更有限的方式使用 Firebase,例如在关键数据驻留在另一个数据库(例如 MongoDB 或 SQL)中时管理用户对您的应用程序的访问是可能的,还是我们过于复杂了利用两种不同的数据库技术构建的基础架构?

感谢任何提供建议的人。邓肯

【问题讨论】:

  • 我会您所聘用的开发人员小组具有强大的 SQL 背景,并且很少或根本没有使用 NoSQL 的经验。我只声明,由于 NoSQL 数据库没有表,所以您运行的连接和查询取决于数据的结构。虽然查询可能看起来“简单”,但如果数据结构正确,那么它们应该是 - 这使得它们非常快速和可扩展。然而,这个问题太宽泛了,不了解用例,无法回答。我建议花一些时间通过入门指南熟悉 Firebase。
  • 哦,是的,您可能通过利用两种不同的数据库技术使其过于复杂。但。我们也不知道应用程序的范围。
  • 谢谢杰。但是我们聘请的开发人员在 MongoDB 方面有很强的背景,这是一种 NoSQL 格式。不,问题似乎是 Firebase 的限制。这就是为什么我要从具有 Firebase 经验的开发人员那里寻找 cmets。
  • 如果他们有 NoSQL 经验,具体问题是什么?他们对复杂连接提出了担忧?你能举例说明这意味着什么吗?此外,Firebase 已记录的限制在您的项目范围内指的是什么也有点不清楚。 MongoDB 也有深度和大小限制 - 16Mb 和 100 级深度。但是,如果您在 NoSQL 数据库中创建 100 层深度的结构,您可能做错了 (IMO)。这个问题似乎是在征求意见,在这种情况下可能没问题。然而,如果没有具体的例子,它就太模糊了。
  • 好的,杰。这是一篇文章,概述了我们关注的一个问题medium.freecodecamp.org/…

标签: firebase firebase-realtime-database web-applications google-cloud-firestore


【解决方案1】:

这并不完全是一个答案,但阅读 cmets 表明该帖子的一个要求是部分字符串查询。根据评论,这就是问题

一位用户输入“Al”试图搜索他的朋友“Alex”。 您想获取数据库中名称包含 文本“Al”以帮助用户缩小搜索范围。 这个任务不是 可以单独通过 Cloud Firestore。

所以检查一个需求,假设我们想要执行那个任务;返回名称以“Al”开头的所有用户

func findPartialString(startingWith: String) {
    let usersColl = self.db.collection("users")
    let endingWith = startingWith + "\u{f8ff}"
    let query = usersColl.whereField("name", isGreaterThanOrEqualTo: startingWith).whereField("name", isLessThan: endingWith)
    query.getDocuments { querySnapshot, err in
        if let err = err {
            print("there was an error: \(err.localizedDescription)")
            return
        }

        if let snap = querySnapshot {
            if snap.count > 0 {
                for document in snap.documents {
                    let key = document.documentID
                    let name = document.get("name") as! String
                    print(key, name)
                }
            } else {
                print("no matches")
            }
        } else {
            print("no data returned in snapshot")
        }
    }
}

会这样称呼

findPartialString(startingWith: "Al")

结果是

uid_5 Alex
uid_4 Albert

还有其他几种方法可以执行相同的任务,因此很明显,这不仅非常有可能,而且代码紧凑且易于维护。

【讨论】:

    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 2015-07-23
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2010-09-08
    相关资源
    最近更新 更多