首页 > 解决方案 > 用关系在数据存储中构造数据的最佳方法

问题描述

我试图掌握数据存储的结构。提前为 n00bness 道歉,但我真的无法理解它......

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

假设我们有:

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

  1. user具有主键的表id
  2. photo带有外键的表,用于user_id链接到照片所在的用户
  3. 任何用户针对任何其他用户的每个单独滑动的swipe表,它将具有 2 个外键,swiper并且swiped
  4. 如果两个人都向右滑动,我们将在其中添加一个新条目的match表格。

您是否会通过拥有这 4 种实体类型在数据存储中进行类似的构造?如果是这样,您如何处理“外键”?

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

标签: nosqlgoogle-cloud-datastoredatastore

解决方案


我通常更喜欢通过ndb 库与 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)以返回基础记录的详细信息。

假设您使用了上述模型,然后在您希望列出照片的位置以及发布照片的用户的姓名或列出滑动和滑动到谁的位置运行查询,我将使用tasklet让查询同时和异步运行。有关工作示例,请参阅旧 Python2 NDB 文档的 tasklets部分


推荐阅读