将像Instagram这样的rdms转换为firebase nosql

Omu*_*kov 5 database-design nosql firebase ionic3 google-cloud-firestore

我计划使用firebase开发类似于instagram的生产就绪混合离子3移动应用程序.我选择firestore nosql来存储数据和查询.

我有在RDMS中设计模式的经验(忽略第二个绿色用户表).但我正在努力为我的应用程序设计NoSql架构.下面我添加了我想将其转换为nosql的RDMS架构. rdms表模式

我想要有效地进行多次查询.

  1. 在主页上显示客人会话的最新照片列表.
  2. 在主页中显示用户关注的关注者列表.
  3. 列出照片标记为"tag"

以上列表的简单Sql查询

  1. Select * from photo LIMIT=50

我应该如何将照片用户表转换为firestore NoSql或NoSql以便有效查询?

Ren*_*nec 4

这是一个建议:

一组名为photos

包含photo以下内容的文件:

  • 自动生成的 ID
  • creation保存日期(即时间戳)的字段
  • 额外的字段,如描述、url/路径等。
  • 字段tags作为具有键值对的对象,如{black: true, cats: true},请参阅此帮助文档以了解基本原理: https: //firebase.google.com/docs/firestore/solutions/arrays。下面的 HTML 代码显示了如何使用/查询它
  • 的一个子集合comments

一组名为users

包含user以下内容的文件:

  • 用户的 ID(即uid来自身份验证)
  • followedUsers保存用户 id 的对象,后跟当前用户{userId1: true, userId2: true}
  • followedPhotosId保存当前用户后跟的照片 ID 的对象{9HzWzyXmcnBDuhTZKoQw: true, fO0OvzJs9M8p9N0jufte: true}
  • followedPhotos包含以下照片详细信息的子集合

以下 HTML 页面显示了如何执行您在帖子中列出的查询,以及一些读取和写入数据的查询:这些最新查询应在多个专门用于在用户关注时保持followedPhotosId对象和集合同步的云函数中使用。followedPhotos新的其他用户和/或当用户(后跟一个或多个用户)添加或删除照片时。

<html>

<head>

<!-- Firebase App is always required and must be first -->
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-app.js"></script>

<!-- Add additional services that you want to use -->
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-functions.js"></script>


</head>

<body>


<script>
  // Initialize Firebase
  var config = {
    apiKey: "",
    authDomain: "xxxxx.firebaseapp.com",
    databaseURL: "https://xxxx.firebaseio.com",
    projectId: "xxxxxx"
  };

  firebase.initializeApp(config);

  var firestoredb = firebase.firestore();


  firestoredb.collection("photos").orderBy("creation", "desc")
    .get()
    .then(function(querySnapshot) {
        console.log("YOUR QUERY #1");
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });


  firestoredb.collection("users").doc("user1").collection("followedPhotos")
    .get()
    .then(function(querySnapshot) {
        console.log("YOUR QUERY #2");
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });


  firestoredb.collection("photos")
    .where('tags.cats', '==', true) //You should create a photo with a "cats" tag
    .get()
    .then(function(querySnapshot) {
        console.log("YOUR QUERY #3");
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });




  firestoredb.collection("photos").orderBy("creation", "desc").limit(50)
    .get()
    .then(function(querySnapshot) {
        console.log("YOUR QUERY #4, i.e; Select * from photo LIMIT=50");
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });

  firestoredb.collection("users")
   .where('followedUsers.user2', '==', true)
   .get()
   .then(function(querySnapshot) {
      console.log("Get all the users who follows user2. To use in the Cloud Function");
      querySnapshot.forEach(function(doc) {
        // doc.data() is never undefined for query doc snapshots
          console.log(doc.id, " => ", doc.data());
      });
  })
  .catch(function(error) {
      console.log("Error getting documents: ", error);
  });


   firestoredb.collection("users")
    .where('followedPhotosId.9HzWzyXmcnBDuhTZKoQw', '==', true)
    .get()
    .then(function(querySnapshot) {
        console.log("Get all the users who follow photo with Id 9HzWzyXmcnBDuhTZKoQw. To use in the Cloud Function");
        querySnapshot.forEach(function(doc) {
            // doc.data() is never undefined for query doc snapshots
            console.log(doc.id, " => ", doc.data());
        });
    })
    .catch(function(error) {
        console.log("Error getting documents: ", error);
    });


    firestoredb.collection("users").doc("user1").get().then(function(doc) {
      if (doc.exists) {
          console.log("Update the followedPhotosId object for user1 after a user she/he follows has added a photo with id abcdefghijklmn. To use in the Cloud Function");
          var followedPhotosId = doc.data().followedPhotosId;;
          Object.assign(followedPhotosId, {abcdefghijklmn: true});
      firestoredb.collection("users").doc("user1").set({followedPhotosId: followedPhotosId});
      } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
      }
    }).catch(function(error) {
      console.log("Error getting document:", error);
    });




</script>


<body>
</html>
Run Code Online (Sandbox Code Playgroud)