2017-11-08 5 views
1

나는 firebase와 NoSQL을 보았을뿐입니다. 그리고 어플리케이션의 최상의 사용을 위해 데이터 구조화 문제를 보았습니다.Firebase 데이터베이스 구조 제안

4 명이 즐길 수있는 (테이블 축구) 게임 결과를 저장하는 응용 프로그램이 있습니다. 각 플레이어는 자신의 평점을 가지고 있으며 각 게임 후에 평점이 다시 계산됩니다. 또한 개별 게임 결과 (목표, 자신의 목표)와 플레이어 위치가 각 게임에 저장됩니다. 앱에 2 가지 기본보기가 있습니다. 게임보기에는 게임 결과를 삽입하고 평점보기에는 평점과 평균 목표로 점수가 매겨진 점수 판이 있습니다. 이와

// players 
{ 
    "playerID": { 
     firstName: string, 
     lastName: string, 
     ratings: { 
      overall: { mu: string, number: string } 
     } 
    } 
} 

// games 
{ 
    "gameID": { 
     participants: { 
      "HOME_DEF": { 
       playerID: string, 
       firstName: string, 
       lastName: string, 
       ratings: { overall: { mu: string, number: string } } 
       adjustedRatings: { overall: { mu: string, number: string } } 
       goals: number, 
       ownGoals: number, 
      }, 
      "AWAY_DEF": { ... }, 
      "HOME_OFF": { ... }, 
      "AWAY_OFF": { ... }, 
     } 
     time: elapsedTime, 
    } 
} 

내가 개체로 모든 게임을 저장하고 게임에서 onCreate 이벤트에 클라우드 기능과 함께 등급을 다시 계산하고있다 : 나는 다음과 같은 구조를 가지고있는 순간

. onCreate 이벤트 중에 읽은 것에서 다른 노드 (플레이어 등)에 액세스 할 수 없으므로 플레이어 등급을 업데이트 할 수 없습니다.

나는이 개 질문이 :

내가 쉽게 선수 평가에 대한 데이터를 업데이트 할 수 있으며,이 뷰에 사용할 그래서이 스키마를 조정해야 할 것입니다 무엇
  1. ?

  2. 점수를받은 평균 목표를 어떻게 계산하고 플레이어 개체에 저장할 수 있습니까? 이와

    // The Firebase Admin SDK to access the Firebase Realtime Database. 
    const admin = require('firebase-admin'); 
    admin.initializeApp(functions.config().firebase); 
    

    , 당신은 같은과 players/ratings 노드에 액세스 할 수 있습니다 :

답변

1

Firebase Admin SDK는 데이터베이스에 다른 위치 및 노드에 대한 액세스를 제공 할 수있는 클라우드 기능 내에서 사용할 수 있습니다

var db = admin.database(); 
var ref = db.ref("players/" + playerId + "/ratings"); 

그런 다음 데이터베이스 구조를 변경할 필요가 없도록 필요한 읽기/쓰기 작업을 수행하십시오.

1

데이터베이스의 구조에 대한 몇 가지 고려 사항은 this이며, this 유튜브 시리즈는 SQL 데이터베이스를 아는 경우 유용 할 수 있습니다. 여기 몇 점을 공유합니다.

1. 데이터베이스를 가능한 한 얕게 유지하십시오. 즉, 데이터의 심층 배치를 피하십시오.

2. 사용자가 필요한 정보 만 다운로드하도록 데이터를 구조화합니다. 이제 염두에 두어야 할 점은 읽기/쓰기 당 요금이 부과되므로 비용을 최적화하는 데있어 사용자가 지불하는 금액과 데이터를 지불하는 금액이 일치해야합니다. 하지만 앱이 방대한 양의 데이터를 버려야 만 문제가되는 것은 아닙니다.

평균 점수를 계산하려면 매번 점수가 변경 될 때마다 트리거되는 Firebase 함수 (samples)를 작성하고 새 평균을 계산하여 데이터베이스에 다시 써야합니다. 는 그럼 아래와 같은 노드에 저장 일부 사용자와 자신의 점수가 가정 해 봅시다 :

동시성 문제가되지 것 같이 기능이

calcul_average : functions.database.ref('/users_goals/{USER}').onWrite(event => { 
.... get data from event i.e, const data = event.data; 
.... AVERAGE CALCULATION LOGIC 
.... then upload the average to where you want in database like this: 
    admin.database().ref(`/location_you_want_to_save/${userId}/average`).set(your_calculated_average); 

}, 

처럼 보일 것입니다 그만큼 그것을이다

users_goals: { 
    user1: 
     goals: 5 
    user2: 
     goals: 5 
    user3: 
     goals: 5 
    ... 
    ... 
} 

. 동시에 여러 사용자가 평균값을 변경할 수 있으면 데이터를 쓸 때 transactions을 사용해야합니다. 평균을 계산하는 것은 당연히 게임 논리에 달려 있으며 쓰기 평균인지 확인해야합니다.

데이터베이스에서 중첩 된 구조를 피하려면 다시 한 번 유의하십시오. 데이터를 퍼뜨리는 것이 좋습니다. 너무 얕은 것은 아닙니다. 나는 최대 3 배로 갈 것이고 그 후에 일이 더러워 지거나 클라이언트 측 각각의 쿼리마다 필요한 많은 데이터를 다운로드하지 않을 것입니다. 건배

+0

정교한 대답에 감사드립니다. – Nick