我正在迅速开发员工时间管理应用程序,很乐意为您提供数据结构以及如何提取一些查询的帮助。
用户数据库如下所示:

https://i.stack.imgur.com/hfSXM.jpg

{"Database":
  {"users"
   {"3iHTIn1MicMdPbgEV6nnMy5ijHq1":
           { "company" : "My Company",
             "email" : "edel@gmail.com",
             "name" : "Tom",
             "type" : "Employee"
           }
   }
  }
 }


用户将在开始和完成作业时进出。
最好在项目中为日期和小时打开新的子项,还是在日期中添加新的子项给用户? (请在回答之前查看我要拉出的查询)
查询帮助:


为用户拉出该月的所有日期和小时。
拉出所有具有相同公司名称的用户并立即工作(现场时钟已满,现场时钟已空)。
拉列出所有用户拥有的所有公司名称,然后删除重复的名称(最好是在项目中仅使用公司名称来再生一个孩子?)


谢谢!!

最佳答案

一些想法。我可能会对数据进行非规范化,因为您有几种查询数据的方法。我正在使用一些伪代码来使答案简短


  为用户拉出该月的所有日期和小时。


这里的挑战是通过两个子节点进行查询;其中一个是特定用户,另一个是日期范围。解决方案是uid和YYMM(年月)的复合查询

结构如下:

jobs
  job_0
    start: 170518090135
    end: 170518170515
    uid_yymm: uid_0_1705
    uid: uid_0
    company_id: company_0
    comp_status: company_0_true
  job_1
    start: 1705190835
    end: 17051910430
    uid_yymm: uid_0_1705
    uid: uid_1
    company_id: company_0
    comp_status: company_0_false

queryOrdered(byChild: "uid_yymm").queryEqual(to value: "uid_0_1705")


这将查询uid_0的所有作业,年份为2017,月份为05。


  拉所有具有相同公司名称的用户并立即工作(该字段
  时钟输入已满,字段时钟输出为空)。


不使用NoSQL搜索数据会使事情变得更复杂,因此我们将完全避免这种情况。同样,复合查询将使用comp_status节点上的上述结构来完成此工作。

queryOrdered(byChild: "comp_status").queryEqual(to value: "company_0_true")


此查询将返回所有为Company_0工作的用户(为true)。当他们不工作时(例如uid_1的情况),请设置为company_0_false。


  拉列表列出所有用户拥有的所有公司名称,然后删除
  复制(最好让项目中的另一个孩子只
  公司名称?)


这有点含糊,但我认为答案是肯定的,有一个单独的公司名称节点,但在用户节点中保留了对该公司的引用。

Database
   users
      3iHTIn1MicMdPbgEV6nnMy5ijHq1
         company: "company_0"
         email: "edel@gmail.com"
         name: "Tom"
         type: "Employee"
      6889js9i99s9ksij8asd88as8d8
         company: "company_1"
         email: "bill@gmail.com"
         name: "bill"
         type: "Employee"

   companies
      company_0
        comp_name: "Electric Company"
      company_1
        comp_name: "Bad Company"

10-08 07:45
查看更多