Firebase에서의 다대다 관계
파이어베이스 데이터베이스를 가지고 있습니다.저는 회사와 계약자가 있습니다.계약자는 둘 이상의 회사에서 근무할 수 있으며 회사는 여러 명의 계약자를 가질 수 있습니다.이것은 많은 사람들에게 솔직한 관계입니다.저는 회사와 계약자에 대한 질문에 답할 수 있기를 원합니다.
- 현재 계약자인 회사를 지정합니다.
- 계약자에게 그들이 무엇을 위해 일하고 있는 회사가 주어집니다.
파이어베이스 내에서 데이터를 구성하기 위한 대안은 무엇입니까?
자가답변은 이것을 모델링하는 한 가지 방법입니다.관계형 데이터베이스에서 이를 모델링하는 방법과 가장 직접적인 관련이 있을 것입니다.
- 청부업자
- 회사들
- 회사 및 협력업체 할당(다대다 커넥터 테이블)
대안으로 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
'programing' 카테고리의 다른 글
완료하는 데 시간이 너무 오래 걸리는 경우 시간 초과 (0) | 2023.07.01 |
---|---|
테마를 사용해야 합니다.이 활동의 AppCompat 테마(또는 하위) (0) | 2023.07.01 |
속성의 최종 목록 나열 - Spring Cloud Config Server (0) | 2023.07.01 |
VBA를 사용하여 Excel 2007에서 셀을 투명하게 만드는 방법 (0) | 2023.07.01 |
Git에서 파일 하나만 풀 수 있습니까? (0) | 2023.07.01 |