查询firebase年/月/日嵌套中的特定ID

时间:2015-02-03 02:12:37

标签: firebase database-design angularfire nosql

我在firebase中有一些结构如下所示。我的客户端使用angularjs + angularfire构建。

'all_records'是这样嵌套的,用于分割数据,并且大多数查询都是以时间为导向的。

'all_records'巢等于:all_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
    }
}

1 个答案:

答案 0 :(得分:3)

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

我会以不同的方式构建事物:

  1. 仅包含push生成的-J密钥
  2. 的记录的列表
  3. 用户列表,包含对其记录的引用
  4. 日期列表/树,引用每个日期的记录
  5. 您的应用应该从不尝试加载所有记录的列表(#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')