파이어베이스에서 데이터를 구성하는 가장 좋은 방법은 무엇입니까?
저는 파이어베이스를 처음 사용하는데, 파이어베이스에 대한 데이터를 구성하는 가장 좋은 방법이 무엇인지 알고 싶습니다.
간단한 예를 들어 보겠습니다.
제 프로젝트에는 지원자와 지원자가 있습니다. 1명의 지원자는 여러 지원자를 가질 수 있습니다.파이어베이스에서 이 두 물체를 어떻게 연관시킬 수 있습니까?관계형 데이터베이스처럼 작동합니까?아니면 데이터 설계 측면에서 접근 방식이 완전히 달라야 합니까?
업데이트: 이제 데이터를 구성하는 문서가 있습니다.또한 NoSQL 데이터 구조에 대한 이 훌륭한 게시물을 참조하십시오.
RDBMS와 달리 계층적 데이터의 주요 문제는 데이터를 중첩할 수 있기 때문에 데이터를 중첩할 수 있기 때문입니다.일반적으로 조인 문 및 쿼리가 없어도 SQL에서와 마찬가지로 데이터를 어느 정도 정규화하려고 합니다.
또한 읽기 효율성이 중요한 곳에서는 정규화를 취소하려고 합니다.이는 모든 대규모 앱(예: Twitter 및 Facebook)에서 사용되는 기술이며, DRY 원칙에 위배되지만 일반적으로 확장 가능한 앱의 필수 기능입니다.
여기서 요점은 읽기 쉽도록 쓰기 작업을 열심히 해야 한다는 것입니다.나중에 그룹을 반복할 수 있도록 하려면 대화방의 경우 메시지, 회의실에 대한 메타 정보 및 구성원 목록을 모두 같은 위치에 두지 마십시오.
Firebase의 실시간 데이터와 SQL 환경의 주요 차이점은 데이터 쿼리입니다.데이터의 실시간 특성 때문에 "SELECT USSER WHER X = Y"라고 말할 수 있는 간단한 방법은 없습니다(동기화된 클라이언트를 견제하기 위해 더 간단한 내부 모델이 필요함).
간단한 예로 올바른 정신 상태를 확인할 수 있습니다. 따라서 다음과 같이 설명합니다.
/users/uid
/users/uid/email
/users/uid/messages
/users/uid/widgets
계층 구조이기 때문에 사용자의 전자 메일 주소를 반복하려면 다음과 같은 작업을 수행합니다.
// I could also use on('child_added') here to great success
// but this is simpler for an example
firebaseRef.child('users').once('value')
.then(userPathSnapshot => {
userPathSnapshot.forEach(
userSnap => console.log('email', userSnap.val().email)
);
})
.catch(e => console.error(e));
이 접근 방식의 문제는 방금 클라이언트가 모든 사용자의 데이터를 다운로드하도록 강요했다는 것입니다.messages
그리고.widgets
그것들이 수천 개가 되지 않는다면 큰 문제는 아닙니다.하지만 각각 5,000개 이상의 메시지를 가진 10,000명의 사용자에게는 큰 일입니다.
이제 계층형 실시간 구조를 위한 최적의 전략이 더욱 분명해졌습니다.
/user_meta/uid/email
/messages/uid/...
/widgets/uid/...
이러한 환경에서 매우 유용한 추가 도구는 인덱스입니다.특정 속성을 가진 사용자의 인덱스를 생성하면 인덱스를 반복하기만 하면 SQL 쿼리를 빠르게 시뮬레이션할 수 있습니다.
/users_with_gmail_accounts/uid/email
예를 들어 gmail 사용자에게 메시지를 보내고 싶다면 다음과 같은 작업을 수행할 수 있습니다.
var ref = firebase.database().ref('users_with_gmail_accounts');
ref.once('value').then(idx_snap => {
idx_snap.forEach(idx_entry => {
let msg = idx_entry.name() + ' has a new message!';
firebase.database().ref('messages').child(idx_entry.name())
.on(
'child_added',
ss => console.log(msg, ss.key)
);
});
})
.catch(e => console.error(e));
제가 다른 SO 게시물에서 데이터의 비정규화에 대한 세부사항을 제공했으니 그것들도 확인해보세요.프랭크가 이미 아난트의 글을 올린 것을 보니, 여기서 반복하지는 않겠습니다만, 그것도 좋은 읽을거리입니다.
파이어베이스는 관계형 데이터베이스와 매우 다릅니다.만약 당신이 그것을 무엇과 비교하고 싶다면, 저는 그것을 계층 데이터베이스와 비교하고 싶습니다.
Anant는 최근 Firebase 블로그에 당신의 데이터를 정규화하지 않는 것에 대해 좋은 글을 올렸습니다. https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
저는 정말로 각 지원자의 자녀로서 각 지원자의 "ID"를 유지할 것을 제안합니다.
당신의 예에 따르면, 당신의 시나리오는 많은 응용 프로그램을 가지고 있는 것처럼 관계적인 세계적으로 지원자는 많은 응용 프로그램을 가지고 있습니다.우리가 소방 기지에 오면 아래와 같이 보입니다.성능 문제 없이 확장해야 합니다.그렇기 때문에 우리는 아래와 같이 비정규화가 필요합니다.
applicants:{
applicant1:{
.
.
applications:{
application1:true,
application3:true
}
},
applicant2:{
.
.
applications:{
application2:true,
application4:true
}
}}
applications:{
application1:{
.
.
},
application2:{
.
.
},
application3:{
.
.
},
application4:{
.
.
}}
언급URL : https://stackoverflow.com/questions/16421179/whats-the-best-way-of-structuring-data-on-firebase
'programing' 카테고리의 다른 글
PL/SQL에서 CASE 문을 실행하는 동안 ORA-06592: CASE를 찾을 수 없는 이유는 무엇입니까? (0) | 2023.06.10 |
---|---|
텍스트 파일의 URL이 주어지면 텍스트 파일의 내용을 읽는 가장 간단한 방법은 무엇입니까? (0) | 2023.06.10 |
vuex, vue-router, pinia 등에 액세스하는 방법SSR 친화적인 방식으로 Vue 구성 요소 외부에? (0) | 2023.06.10 |
Firebase 데이터를 Java 개체로 변환하는 방법...? (0) | 2023.06.10 |
다른 워크북에서 매크로 실행 (0) | 2023.06.10 |