programing

Firebase에서의 다대다 관계

lastcode 2023. 7. 1. 08:46
반응형

Firebase에서의 다대다 관계

파이어베이스 데이터베이스를 가지고 있습니다.저는 회사와 계약자가 있습니다.계약자는 둘 이상의 회사에서 근무할 수 있으며 회사는 여러 명의 계약자를 가질 수 있습니다.이것은 많은 사람들에게 솔직한 관계입니다.저는 회사와 계약자에 대한 질문에 답할 수 있기를 원합니다.

  1. 현재 계약자인 회사를 지정합니다.
  2. 계약자에게 그들이 무엇을 위해 일하고 있는 회사가 주어집니다.

파이어베이스 내에서 데이터를 구성하기 위한 대안은 무엇입니까?

자가답변은 이것을 모델링하는 한 가지 방법입니다.관계형 데이터베이스에서 이를 모델링하는 방법과 가장 직접적인 관련이 있을 것입니다.

  • 청부업자
  • 회사들
  • 회사 및 협력업체 할당(다대다 커넥터 테이블)

대안으로 4개의 최상위 노드를 사용할 수 있습니다.

  • 청부업자
  • 회사들
  • 회사 계약자
  • 청부업자 회사

마지막 두 노드는 다음과 같습니다.

companyContractors
    companyKey1
        contractorKey1: true
        contractorKey3: true
    companyKey2
        contractorKey2: true
contractorCompanies
    contractorKey1
        companyKey1: true
    contractorKey2
        companyKey2: true
    contractorKey3
        companyKey1: true

이 양방향 구조를 사용하면 "회사의 계약자"와 "회사의 계약자"를 모두 조회할 필요 없이 찾을 수 있습니다.특히 계약자와 회사를 추가할 때 더욱 빨라질 수밖에 없습니다.

이 기능이 앱에 필요한지 여부는 필요한 사용 사례, 예상되는 데이터 크기 등에 따라 달라집니다.

SQL 개발자를 위해 NoSQL 데이터 모델링을 읽고 Firebase를 보는 것이 좋습니다.이 질문은 #AskFirebase Youtube 시리즈의 에피소드에도 등장했습니다.

업데이트(2017016)

누군가가 "계약자" 및 "회사" 노드에서 실제 항목을 검색하는 것과 관련하여 여기에 링크되는 후속 질문을 게시했습니다.파이어베이스에는 다음과 같은 기능이 없기 때문에 한 번에 하나씩 검색해야 합니다.SELECT * FROM table WHERE id IN (1,2,3)그러나 요청이 단일 연결을 통해 파이프라인으로 연결되기 때문에 이 작업은 생각만큼 느리지 않습니다.자세한 내용은 여기를 참조하십시오. 단일 이벤트를 반복적으로 관찰하는 대신 쿼리를 사용하여 소셜 네트워크 앱에 대한 게시물을 빠르게 가져올 수 있습니다.

좀 더 조사한 후에, 저는 제 질문에 답하려고 노력할 것입니다.저는 많은 다른 게시물을 검토했고 다대다 문제에 대한 한 가지 해결책은 계약자 키 목록을 회사 개체 내에 저장하고 각 계약자 개체 내에 회사 키 목록을 저장하는 것입니다.이는 아래의 예와 함께 설명되어 있습니다.

companies : {
  companyKey1 : {
    name : company1
    ...
    contractors : {
      contractorKey1 : true,   
      contractorKey3 : true
    }
  }
  companyKey2 : {
    name : company2
    ...
    contractors : {
      contractorKey2 : true,  
    } 
  }
}
contrators : {
  contractorKey1 : {
     name : bill
     ...
     companies : {
        companyKey1 : true
     }
   }
  contractorKey2 : {
     name : steve
     ...
     companies : {
        companyKey1 : true
     }

   }
  contractorKey3 : {
     name : jim
     ...
     companies : {
        companyKey2 : true
     }
   }
}

이 조직은 앞서 언급한 질문에 답할 수 있다는 의미에서 "작동"합니다.그러나 이 솔루션의 단점은 계약자/회사 할당이 변경될 때 유지해야 할 두 개의 목록이 있다는 것입니다.이 정보를 하나의 목록으로 표현할 수 있는 방법이 있다면 더 좋을 것입니다.

저는 제가 더 나은 해결책을 생각해냈다고 생각합니다.해결책은 companyAndContractorAssignment라는 회사와 계약자 외에 세 번째 목록을 만드는 것입니다.이 목록의 요소는 단일 계약자와 회사 간의 관계를 나타냅니다.내용은 계약자 Key와 회사 Key라는 한 쌍의 필드가 될 것입니다.그런 다음 회사 내의 계약자 목록과 계약자 내의 회사 목록을 제거할 수 있습니다.이 대체 구조는 아래에 나와 있습니다.회사 개체 내에 계약자 목록이 없고 계약자 개체가 있는 회사 목록이 없습니다.

companies : {
  companyKey1 : {
    name : company1
    ...
  }
  companyKey2 : {
    name : company2
    ...
  }
}
contrators : {
  contractorKey1 : {
     name : bill
     ...
  }
  contractorKey2 : {
     name : steve
     ...
  }
  contractorKey3 : {
     name : jim
     ...
  }
}
companyAndContractorsAssignment : {
  key1 : {
    contractorKey1 : true,
    companyKey1: true,
  }
  key2 : {
    contractorKey3 : true,
    companyKey1: true,
  }
  key3 : {
    contractorKey2 : true,
    companyKey2: true,
  }

이 대체 구조를 사용하면 회사 및 계약자 할당에 대한 ByChild/equalTo 쿼리를 사용하여 모든 계약자 또는 회사의 모든 계약자를 찾을 수 있습니다.그리고 이제 유지해야 할 목록은 하나뿐입니다.이것이 제 요구사항에 가장 적합한 해결책이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/41527058/many-to-many-relationship-in-firebase

반응형