을 참조하는 내가 그룹 메시징 애플리케이션을 구축하기 위해 노력하고있어 가정 수 있습니다, 그래서 너무처럼 내 데이터베이스 구조 설계 :이 큰 규모 것 중포 기지의 문서에 따르면중포 기지 데이터베이스 : 동적 값
users: {
uid1: { //A user id using push()
username: "user1"
email: "[email protected]"
timestampJoined: 18594659346
groups: {
gid1: true,
gid3: true
}
}
uid2: {
username: "user2"
email: "[email protected]"
timestampJoined: 34598263402
groups: {
gid1: true,
gid5: true
}
}
....
}
groups: {
gid1: { //A group id using push()
name: "group1"
users: {
uid1: true,
uid2: true
}
}
gid2: {
name: "group2"
users: {
uid5: true,
uid7: true,
uid80: true
}
}
...
}
messages: {
gid1: {
mid1: { //A message id using push()
sender: uid1
message: "hello"
timestamp: 12839617675
}
mid2: {
sender: uid2
message: "welcome"
timestamp: 39653027465
}
...
}
...
}
합니다.
이제 내 응용 프로그램 내부에서 모든 메시지에 보낸 사람의 사용자 이름을 표시하려고한다고 가정합니다.
모든 단일 메시지의 사용자 이름을 쿼리하는 것은 분명히 나쁘다. 그래서 내가 발견 한 해결책 중 하나는 모든 메시지에서 사용자 이름을 복제하는 것이 었습니다.
메시지 노드는 지금과 같이 보일 것이다 :
messages: {
gid1: {
mid1: { //A message id using push()
sender: uid1
username: "user1"
message: "hello"
timestamp: 12839617675
}
mid2: {
sender: uid2
username: "user2"
message: "welcome"
timestamp: 39653027465
}
...
}
...
}
지금 나는 그의 이름을 변경하려면 사용자에 대한 옵션을 추가 할 수 있습니다.
사용자가 사용자 이름을 변경하기로 결정한 경우 사용자 노드와 그가 보낸 모든 단일 메시지에서 사용자를 업데이트해야합니다.
"모든 메시지에 대한 청취자"접근법을 사용하면 단일 위치에서 이름을 변경해야하므로 사용자 이름을 변경하는 것이 쉽습니다.
이제 그는 보낸 모든 그룹의 모든 메시지에서 이름을 업데이트해야합니다.
전체 메시지 노드에 사용자 ID를 쿼리하는 것은 좋지 않은 디자인이므로 사용자가 보낸 모든 메시지의 위치를 저장하는 다른 노드를 만드는 것이 좋습니다.
그것은 다음과 같이 보일 것입니다 :
userMessages: {
uid1: {
gid1: {
mid1: true
}
gid3: {
mid6: true,
mid12: true
}
...
}
uid2: {
gid1: {
mid2: true
}
gid5: {
mid13: true,
mid25: true
}
...
}
...
}
을 그래서 지금은 신속하게 특정 사용자에 대한 모든 메시지의 위치를 가져, 단일 updateChildren와 사용자 이름() 호출을 업데이트 할 수 있습니다.
이 방법이 가장 좋은 방법입니까? 동적 인 값 (사용자 이름)을 참조하기 때문에 정말로 많은 데이터 (수백만 개의 메시지)를 복제해야합니까?
동적 데이터를 처리 할 때 더 좋은 방법이 있습니까?
많은 좋은 답변이 이미 있습니다. 나는 당신이 그 경로를 선택하는 경우를 대비하여 삼진/비 표준화 된 데이터를 작성하는 방법에 대해 잠시 전에 쓴 대답에 연결합니다 : http://stackoverflow.com/questions/30693785/how-to-write-denormalized -data-in-firebase –