【问题标题】:Query specific ID's in a firebase year/month/day nest在 Firebase 年/月/日嵌套中查询特定 ID
【发布时间】:2015-02-03 02:12:37
【问题描述】:

我在 firebase 中有一些结构如下的数据。我的客户端是用 angularjs + angularfire 构建的。

'all_records' 像这样嵌套以拆分数据,并且大多数查询都是面向时间的。

“all_records”嵌套等于:all_records > year > month > date > records。

我想将记录与发布记录的用户相关联,因此在创建记录时已将关联 ID 保存到“my_records”中的用户。

此示例显然是一个非常小的数据集,但允许可扩展性并可能拥有数十万条记录,这是查询“all_records”以仅获取用户“my_records”的最佳方式。

谢谢

all_records : {

    2015 : {
        2 : {
            3: {
                -JgJJaLaL7LuuRL_IO7c : {
                    data: big data;
                },
                -JgJfaOsyfZe_mZPTApA : {
                    data: lots of data;
                },
                ...
            },
            ...
        },
        1 : {
            28 : {
                -JgJJaLaL7kddEl_ddfE : {
                    data: some more data;
                }
            },
            27 : {
                -JgJfadkdjEk_mZPTApA : {
                    data: even more;
                }
            },
            ...

        },
        ...
    },

    2014 : {
        12 : {
            24: {
                -JgJmnvkFdqc_y63lqcv : {
                    data: decemeber data;
                },
                -JgK6xbXY_E58lshaiVa : {
                    data: and a bit more data;
                }
            },
            ...
        },
        11 : {
            ...
        },
        ...
    }
}

user: {
    name : James,
    my_records : {
        -JgK6xbXY_E58lshaiVa: true,
        -JgJJaLaL7LuuRL_IO7c: true
    }
}

【问题讨论】:

    标签: firebase database-design angularfire nosql


    【解决方案1】:

    您用户的my_records 目前没有足够的信息直接映射到记录。您需要在信息中添加日期(年、月和日)以允许直接查找。

    我会改用不同的结构:

    1. 仅包含 push 生成的 -J 键的记录列表
    2. 用户列表,以及对其记录的引用
    3. 日期列表/树,每个日期的记录引用

    您的应用程序应该从不尝试加载所有记录的列表 (#1)。相反,它应该加载相关用户(来自 #2)或来自 (#3) 的相关日期,然后加载从那里引用的记录。

    all_records : {
        -JgJJaLaL7LuuRL_IO7c : { data: big data; },
        -JgJfaOsyfZe_mZPTApA : { data: lots of data; },
        -JgJJaLaL7kddEl_ddfE : { data: some more data; }
        -JgJfadkdjEk_mZPTApA : { data: even more; }
    }
    
    dates: {
        2015 : {
            2 : {
                3: {
                    -JgJJaLaL7LuuRL_IO7c : true,
                    -JgJfaOsyfZe_mZPTApA : true,
                    ...
                },
                ...
            },
            1 : {
                28 : {
                    -JgJJaLaL7kddEl_ddfE : true
                },
                27 : {
                    -JgJfadkdjEk_mZPTApA : true
                },
                ...
            },
            ...
        }
    }
    
    user: {
        name : James,
        my_records : {
            -JgK6xbXY_E58lshaiVa: true,
            -JgJJaLaL7LuuRL_IO7c: true
        }
    }
    

    您可能还想考虑将日期构建为一个简单的列表,而不是树:

    dates: {
        20150203: {
            -JgJJaLaL7LuuRL_IO7c : true,
            -JgJfaOsyfZe_mZPTApA : true,
            ...
        },
        20150128 : {
            -JgJJaLaL7kddEl_ddfE : true
        },
        20150127 : {
            -JgJfadkdjEk_mZPTApA : true
        },
    }
    

    虽然为日期构建一棵树很诱人,但我怀疑你会从中受益匪浅。上面的结构更简单,可以进行更广泛的查询,例如“给我 2015 年第一季度的所有日期”:ref.child('dates').startAt('20150101').endAt('20150331')

    【讨论】:

    • 感谢您的坦率。因此,以您上面的示例为例,我按日期或用户“my_records”查询,这将给我一个记录ID列表。然后我如何使用它来查询“all_records”。
    • 我能看到的唯一方法是将第一个查询的结果通过一个循环和每个查询“all_records” ref.equalTo(id) ?谢谢
    • 可以,但是直接查找(而不是使用equalTo 进行查询)会更有效:ref.child('all_records').child(id).once('value', function(snapshot) { console.log(snapshot.val()); });
    • 我明白了,当然!如果“all_records”可能有数十万个条目,这应该不会令人头疼?还说用户有参数一万个“my_records”会在循环中执行一万个查询以检索他们的所有数据是否可行?感谢您的帮助,我仍然对 nosql 感兴趣!
    猜你喜欢
    • 2013-09-25
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多