如何在Firebase数据库中正确存储/检索数据

时间:2019-07-14 20:56:15

标签: reactjs firebase firebase-realtime-database

我有用户和待办事项。我想查看所有用户的所有待办事项,然后单击一个待办事项时,我想从创建待办事项的用户那里获取信息。同时,我想单击一个用户并查看该特定用户的旧待办事项。

什么是正确的数据存储方式?

我目前正在这样做以检索数据:

     todos.id=222
        <Link to={'/todos/' + todos.id}>  

        todos:{
        222:{
        uid:123,
        done:false,
        task: buy milk,
        timestamp:2019-01-04
        }
        ,
    333:{
        uid:166,
        done:false,
        task: buy milk,
        timestamp:2019-01-04
        }
       }



   Users:{     
        123:{
        email:'@',
        username:'Foo',
        oldTodos:{
                   1:{
                      done:true,
                      timestamp:2019-01-01,
                      task: walk dog,
                     },
                   2:{
                      done:true,
                      timestamp:2019-01-03,
                      task: pet cat,
                     }
                  }
           }
     }



firebase
.database()
.ref('todos/' + 222)
.once('value')
.then(function(snapshot) {
    var uid = (snapshot.val() && snapshot.val().uid)|| '0'
//uid in this case is 123, and then i doo second call to get user data

    firebase
    .database()
    .ref('users/' + 123)
    .once('value')
    .then(function(snapshot) {
     var username = (snapshot.val() && snapshot.val().username) || '0'      
     })

 })

但是这种感觉并不正确。 最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

您可以通过对数据库进行规范化来获得更有效的带宽:

对于用户:

users/{uid}/{
  email: ...,
  name: ...,
  username: ...,
  uid: ...,
}

待办事项列表:

user-todos/{uid}/{
  done: ...,
  task: ...,
  timestamp: ...,
}

对于旧的待办事项列表:

user-old-todos/{uid}/{
  done: ...,
  task: ...,
  timestamp: ...,
}

如果您想获得所有用户的所有待办事项:

firebase
  .database()
  .ref('user-todos')
  .once('value')
  .then(function(snapshot) {
    let allTodos = snapshot.val()
    // you will get uid and todo data

  })

如果您想获得所有用户的所有待办事项:

  firebase
  .database()
  .ref('user-todos')
  .once('value')
  .then(function(snapshot) {
    let allTodos = snapshot.val()
    // you will get uid and todo data
  })

如果要获取用户数据:

  // use uid from previous query
  firebase
  .database()
  .ref('users')
  .child(uid)
  .once('value')
  .then(function(snapshot) {
    let userData = snapshot.val()
    // you will get user data
  })

如果您想变老的待办事项:

  // use uid from previous query
  firebase
  .database()
  .ref('user-old-todos')
  .child(uid)
  .once('value')
  .then(function(snapshot) {
    let oldTodos = snapshot.val()
    // you will get all old to do list
  })