【问题标题】:Best way to structure data in datastore with relationships使用关系在数据存储中构造数据的最佳方法
【发布时间】:2021-12-13 04:22:24
【问题描述】:

我正在努力掌握 Datastore 的结构。提前为 n00bness 道歉,但我真的无法理解它......

考虑一个典型的约会应用程序,它将谷歌云的数据存储用作“数据库”。

假设我们有:

  • 用户
  • 照片
  • 滑动
  • 匹配

在一个典型的 SQL 风格数据库中,我可能会选择拥有(除其他外):

  1. 主键为iduser
  2. 具有user_id 外键的photo 表链接到照片所在的用户
  3. 一个swipe 表,用于任何用户针对任何其他用户的每次滑动,它将有两个外键swiperswiped
  4. match 表,如果 2 个人都向右滑动,我们会在其中添加一个新条目。

您是否会通过这 4 种实体类型在数据存储中以类似方式构造它?如果是这样,您如何处理“外键”?

或者您会将其中的一些嵌套在文档中,例如每个用户都有一个嵌套在其中的照片列表,或者他们所有滑动/匹配的列表,以确保匹配中的两个用户都反映了这一点?

【问题讨论】:

    标签: nosql google-cloud-datastore datastore


    【解决方案1】:

    我通常更喜欢通过 ndb library 与 Datastore 进行交互(如果您不使用 Python,您可能仍然了解如何在自己的运行时应用以下建议)。

    使用 ndb 库,我可能会看到自己使用你所拥有的东西,你所指的“外键”将被实现为 ndb.KeyProperty

    你可能拥有的一个非常粗略的简介

        # This is your user KIND
        class User(ndb.Model):
         ....
    
        # This is your photo KIND
        class Photo(ndb.Model):
           # This ties each record in Photo to a person in your User table
           user = ndb.KeyProperty(kind="User", required=True)
         ....
    
    
        # This is your Swipes KIND
        class Swipes(ndb.Model):
           # This ties each swiper to a person in your User table
           swiper = ndb.KeyProperty(kind="User", required=True)
    
           # This ties each swiped to a person in your User table
           swiped = ndb.KeyProperty(kind="User", required=True)
         ....
    
    

    在 UI 中,您可以单击定义为 ndb.KeyProperty 的任何列,它将打开基础记录。在您的代码中,您可以直接运行查询(执行 GET)以返回基础记录的详细信息。

    假设您使用上述模型,然后在您希望列出照片的位置以及发布照片的用户的姓名或列出滑动以及滑动到谁的位置运行查询,我将使用 tasklets 进行查询并发和异步运行。请参阅old Python2 NDB documentation 上的 tasklets 部分以获取工作示例

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 2016-08-09
      • 2021-12-19
      • 2021-02-11
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多