设置用于在Firebase中查询的数据结构

时间:2016-08-26 21:12:35

标签: javascript firebase firebase-realtime-database nosql

我目前正在创建一个管理员应该可以标记图片的应用。访问者可以搜索标签,并查看具有该标签的图像。

一张图片可以有多个标签。这表示我目前如何设置数据:

Images: {
    PUSH_ID: {
        url: "https://cdn.filestackcontent.com/o0ze07FlQjabT9nuteaE",
        tags: {
            PUSH_ID: {
                tag: "1324"
            },
            PUSH_ID: {
                tag: "4321"
            }
        }
    }
}

当访问者搜索标记时,我需要能够查询标记,并找到具有给定标记的图像的URL。我当时认为有些事情可行:

ref.orderByChild('tags/tag').equalTo(tag).once("value"...)

但经过一些阅读后,我发现您只能在Firebase中深入查询一个级别。

如果是这种情况,我需要重构我的数据,但我无法弄清楚它应该如何构建。

任何人都可以帮助我吗?

顺便说一句;我被告知我应该使用像Elasticsearch这样的东西来查询Firebase,但是这个应用程序适用于流量有限的事件。

谢谢!

2 个答案:

答案 0 :(得分:3)

在Firebase(以及大多数NoSQL数据库)中建模数据时,您需要为应用程序想要使用它的方式建模数据。

例如:

"tag1234": true

我从你的模特改变了一些东西:

  1. 我仍然存储每个图片的标签,以便您可以在用户观看单张图片时显示它们
  2. 但现在我们以model.js格式存储代码,这样可以防止图像多次使用相同的标记进行标记。每当您觉得需要对要执行contains()操作的数组时,请考虑使用这种类似于集合的方法。
  3. 我在标签号前加上一个静态字符串,这可以防止Firebase将标签号解释为数组索引。
  4. 我们现在还存储了tags-to-image-id的映射。在此地图中,您可以轻松查找特定标记的所有图像ID,然后循环加载图像。
  5. 我们基本上复制了一些数据(标签存储了两次),以确保我们可以通过两种方式查看信息。如果您有更多方法可以访问数据,则可能需要进行更多复制。这在NoSQL数据库中是正常的,并且是它们扩展得如此之好的部分原因。

    我强烈建议您在NoSQL data modeling上阅读这篇文章。

答案 1 :(得分:2)

这个结构中有一个像这样的标签节点,不是吗?

Tags: {
    "tag1324": {
        tagName: pets    
    },
    "tag4321": {
        tagName: daffodil
    }
    "tag5678": {
        tagName: tasmanian wolf
    }