2017-05-19 4 views
0

신속한 직원 근무 시간 관리 앱을 개발 중이며 데이터 구조 및 쿼리 추출 방법을 알려 드리겠습니다. 사용자 데이터베이스는 다음과 같이이다 :Firebase 구조 데이터베이스 및 쿼리

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

{"Database": 
    {"users" 
    {"3iHTIn1MicMdPbgEV6nnMy5ijHq1": 
      { "company" : "My Company", 
      "email" : "[email protected]", 
      "name" : "Tom", 
      "type" : "Employee" 
      } 
    } 
    } 
} 

사용자 것이다 시계 아웃 할 때 시작과 마무리 작업. 프로젝트에서 날짜와 시간에 새 아이를 열거 나 날짜가있는 아이를 추가하는 것이 더 낫습니다. 쿼리와 도움말합니다 (내가 대답하기 전에 당겨 할 쿼리를 참조하십시오) :

  1. 이 사용자에 대해이 달의 모든 날짜와 시간을 당깁니다.

  2. 회사 이름이 동일하고 현재 작동하는 사용자를 모두 당깁니다. (필드 시계가 꽉 찼으며 필드 시계가 비어 있음).

  3. 풀 목록 모든 사용자에 대해이 중복 삭제 모든 회사 이름은 (유일한 회사의 이름으로 프로젝트의 다른 아이를 만들기 위해 더 나은 무엇입니까?)

감사합니다!

+0

Firebase 구조의 스 니펫을 텍스트로, 이미지없이 포함하십시오. 이미지를 검색 할 수 없으므로 이미지를 답안의 일부로 사용해야하는 경우 텍스트를 사용하면 다시 타이핑하는 대신 복사하여 붙여 넣을 수 있습니다. 또한 링크가 끊어 지므로 링크가 연결되지 않습니다. – Jay

+0

모든 쿼리는 두 구조 중 하나를 사용하여 수행 할 수 있습니다. 두 개의 추가 하위 노드가 필요합니다. 두 가지 방법으로 복합 쿼리를 수행 할 수 있습니다. 검색어 # 3은 분명하지 않습니다. – Jay

+0

안녕하세요, Jay, Firebase 구조를 텍스트로 업데이트합니다. 감사합니다! –

답변

0

몇 가지 생각. 나는 당신이 그것을 쿼리하기를 원하는 몇 가지 방법이 있기 때문에 아마 데이터를 비정규화할 것이다. 답변을 짧게 유지하기 위해 의사 코드를 사용 중입니다.

이 달의 모든 날짜와 시간을 사용자에게 표시합니다.

여기에서는 두 개의 하위 노드로 쿼리합니다. 그 중 하나는 특정 사용자이고 다른 하나는 일정 범위입니다. 이 솔루션은 구조 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") 

이가되는 2017 달되는 해에 uid_0에 대한 모든 작업을 조회합니다 05.

회사 이름이 동일하고 현재 작동하는 모든 사용자를 당깁니다 ( 입력란이 가득 차고 입력란 시계가 비어 있음).

데이터가 없으면 NoSQL을 사용하여 작업을 더 복잡하게 만들 수 있으므로 완전히 피할 것입니다. 다시 복합 쿼리는 comp_status 노드에서 위의 구조로 작업을 수행합니다.

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

이 쿼리는 clock_ (true) 인 company_0에서 근무하는 모든 사용자를 반환합니다. uid_1의 경우와 같이 시계가 사라지면 company_0_false로 설정됩니다. 모든 사용자에 대해 가지고 가 중복 삭제

풀 목록의 모든 회사 이름은 (단지 회사의 이름으로 프로젝트의 다른 아이를 만들기 위해 더 나은 무엇입니까?)

이것은 다소 모호하지만 대답은 예라고 생각합니다. 별도의 회사 이름 노드가 있지만 사용자 노드의 회사에 대한 참조는 보관하십시오.

Database 
    users 
     3iHTIn1MicMdPbgEV6nnMy5ijHq1 
     company: "company_0" 
     email: "[email protected]" 
     name: "Tom" 
     type: "Employee" 
     6889js9i99s9ksij8asd88as8d8 
     company: "company_1" 
     email: "[email protected]" 
     name: "bill" 
     type: "Employee" 

    companies 
     company_0 
     comp_name: "Electric Company" 
     company_1 
     comp_name: "Bad Company" 
관련 문제