Rob*_*man 6 firebase firebase-realtime-database angularfire2
我有一个Firebase数据库.我有Job对象和Item对象.每个作业可以包含许多项目,并且一个项目必须由单个作业(简单一对多)包含.我目前的数据库结构是Item和Job都是firebase中的顶级列表,每个Item包含它所属的jobKey.只要我知道作业密钥,这允许我查找作业中的所有项目.用于查找项目的firebase代码需要一个查询,其中包含项目中jobKey的"orderBy".因此,很容易检索作业的所有项目.但是,我还想根据项目中的其他数据对项目进行排序和过滤.但是由于单个"orderBy"的firebase限制,我无法使用firebase完成第二级过滤.这是我的挑战.我现有数据的结构如下所示.
+--jobs
|
+-- jobKey1
| |
| +-- <jobdata1> ..
|
+-- jobKey2
|
+-- <jobdata2>..
+--items
|
+-- itemKey1
| |
| +-- jobKey : jobKey2 // this item belongs to job2
| |
| +-- <the rest of item1 data
|
+-- itemKey2
| |
| +-- jobKey : jobKey2 // this item belongs to job2
| |
| +-- <the rest of item2 data
|
+-- itemKey3
| |
| +-- jobKey : jobKey1 // this item belongs to job1
| |
| +-- <the rest of item3 data
|
+-- itemKey4
|
+-- jobKey : jobKey1 // this item belongs to job1
|
+-- <the rest of item4 data
Run Code Online (Sandbox Code Playgroud)
如前所述,我希望能够检索作业的所有项目,然后按项目中的各个字段对项目进行排序和过滤.鉴于上面的结构,执行此操作的唯一方法(我看到)是使用firebase查询来检索项目,然后使用组件中的逻辑(我使用angular2)将所有项目缓存到某种集合中然后基于缓存的数据进行排序和过滤.这不是很令人满意,必须有更好的方法.什么是合理的替代品?
我想出了解决方案.
构造数据的另一种方法是将项目列表直接嵌套在作业中.这如下图所示.这允许使用firebase查询在项目数据中进行排序和过滤.这似乎是一个很好的解决方案,但它有缩放的缺点.
+--jobs
|
+-- jobKey1
| |
| +-- <jobdata> ..
| |
| +-- items
| |
| +-- itemKey3
| | |
| | +-- <the rest of item3 data>
| |
| +-- itemKey4
| |
| +-- <the rest of item4 data>
|
+-- jobKey2
|
+-- <jobdata>..
|
+-- items
|
+-- itemKey1
| |
| +-- <the rest of item1 data>
|
+-- itemKey2
|
+-- <the rest of item2 data>
Run Code Online (Sandbox Code Playgroud)
这个解决方案的缺点是,如果项目列表很大,它不能很好地扩展,因为每次读取作业都会读取所有项目.在我的例子中,当我读取Job对象时,我不想读取整个项目列表,而是想要创建项目列表的ref并在项目列表中使用firebase查询/过滤器功能.因此,将项目列表放在作业中并没有直接的好处.在我的应用程序中,实际限制是数百项.因此,即使该解决方案可能适用于我的应用程序,也必须有更好,更具可扩展性的解决方案.
更好的解决方案.
在进一步考虑之后,此问题的最佳解决方案是创建特定于作业但不包含在Job对象中的Item列表,以便在读取Job时,不必读取整个列表.我们还保留了根据数据对项目列表中的数据进行排序/过滤的功能.该结构如下所示.每个作业的ItemLists保存在路径"itemlists/<jobKey>/items"中
+--jobs
|
+-- jobKey1
| |
| +-- <jobdata1> ..
|
+-- jobKey2
|
+-- <jobdata2>..
+--itemlists
|
+-- jobKey1 // items list for job1
| |
| +--items
| |
| +-- itemKey3
| | |
| | +-- <the rest of item3 data
| |
| +-- itemKey4
| | |
| | +-- <the rest of item4 data
|
+-- jobKey2 // items list for job2
|
+--items
|
+-- itemKey1
| |
| +-- <the rest of item1 data
|
+-- itemKey2
|
+-- <the rest of item2 data
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5755 次 |
| 最近记录: |