nosql - 用关系在数据存储中构造数据的最佳方法
问题描述
我试图掌握数据存储的结构。提前为 n00bness 道歉,但我真的无法理解它......
考虑一个典型的约会应用程序,它将使用谷歌云的数据存储作为“数据库”。
假设我们有:
- 用户
- 相片
- 刷卡
- 火柴
在典型的 SQL 风格数据库中,我可能会选择拥有(除其他外):
user
具有主键的表id
photo
带有外键的表,用于user_id
链接到照片所在的用户- 任何用户针对任何其他用户的每个单独滑动的
swipe
表,它将具有 2 个外键,swiper
并且swiped
- 如果两个人都向右滑动,我们将在其中添加一个新条目的
match
表格。
您是否会通过拥有这 4 种实体类型在数据存储中进行类似的构造?如果是这样,您如何处理“外键”?
或者您会将其中的一些嵌套在文档中,例如每个用户都有一个嵌套在其中的照片列表,或者他们所有滑动/匹配的列表,以确保匹配中的两个用户都反映了这一点?
解决方案
我通常更喜欢通过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部分
推荐阅读
- coldfusion - 如何在 CFWheels 上重新加载模型方法?
- java - 使用 jar 但不在库本身中时出错
- c++ - 如何使用默认值 0 或 -1 初始化 unordered_set?
- r - 如何使用动态名称计算 R 数据框中的多个新列
- database-design - CAP 定理:选择一致性和可用性?
- tensorflow - AbortedError:找不到会话 902faae618c6a822
- python - 如何使用 python argparse api 在组中收集命令行参数?
- c - IAR 链接器在初始化期间将代码从 FLASH 复制到 RAM
- javascript - 如何根据 HTML 中的输入字符串动态更改文本颜色?
- datetime - 如何在上述范围之外使用变量 selectedDate(或任何变量)