【问题标题】:Manage nested list of entities within entities in Google Cloud Datastore管理 Google Cloud Datastore 中实体内的嵌套实体列表
【发布时间】:2018-03-14 00:45:57
【问题描述】:

我是 Datastore 的新手,我正在尝试创建一个简单的应用来跟踪图书借阅情况。

我希望数据库架构如下:

books:
 book_id
  name:
  borrowing:
   timestamp:
    user_id
    firstname
    email

users:
 name:
 borrowed:
  timestamp:
   book_id

我正在使用控制台来配置数据库。

我定义了两种:BooksUser

业务逻辑:

  • n 用户可以借阅 1 本书。
  • 1 个用户可以借 n 本书

基本上,当用户借书时,我希望出现以下两个插入:

  • 一个新的借阅条目被附加到 Book 类型的书籍实体中,当前时间戳作为键,user_id、名字和电子邮件作为属性
  • 一个新借来的条目被追加到ty User的用户实体,当前时间戳为key,book_id为property

如何使用 Datastore 实现这一点(管理嵌套列表子项)?通过嵌入式实体?家长参考?

这是我所期望的一个例子:

{
  "books": {
      "book1": {
          "name": "book number 1",
          "borrowing": {
              "1234567890": {
                  "user_id": "user1",
                  "firstname": "john",
                  "email": "john@example.com"
              },
              "2234567890": {
                  "user_id": "user2",
                  "firstname": "robin",
                  "email": "robin@example.com"
              }
          }
      }
      ...
  },
    "users": {
        "user1": {
            "firstname": "robin",
            "email": "robin@example.com",
            "borrowed": {
                "1234567890": {
                    "book_id": "book1"
                },
                "3247829398": {
                    "book_id": "book99"
                }
            }
        },
        ...
    }
}

【问题讨论】:

    标签: google-cloud-datastore


    【解决方案1】:

    一般而言,这不是一种可扩展的方法:每次用户借书时,您都必须重新编写 userbook 实体,随着这两个实体的不断增长,这将变得越来越慢。

    我建议一种不同的方法:向您的架构添加一个新类型,我们称之为borrowed_book,代表用户借阅的一本书:

    borrowed_book:
      book_id
      user_id
      timestamp
    

    现在,每次用户借书时,您只需创建一个这样的borrowed_book 实体,指向bookuseruserbook 实体没有变化。 而且不需要嵌套

    旁注:我会将firstnameemail 属性放在user 实体类型下,它们并不真正属于借用事件,每次发生此类事件时它们都会被复制用户。

    也尽量不要被祖先混淆 - 建立关系不需要它,请参阅E-commerce Product Categories in Google App Engine (Python)

    【讨论】:

    • (我可能应该/将把它放在一个新问题中):我对您提出的设计有一个后续问题。如果我们想要一个功能来支持诸如“用户 A 曾经借过哪些属于‘图画书’类别并在 2000 年之前出版的书”之类的查询。是否可以在当前设置中进行查询?所以我想我们必须将那些相关的属性(publish_year 和 category)从 book 实体复制到 borrowed_book 实体。那么如果一本书的publish_year有更新,那borrowed_book怎么会自动更新呢?
    • 确实,一个查询是不够的。可以通过 2 个查询和结果相交来完成。如果您将图书信息复制到借阅信息中,您可以通过推送任务处理图书更新,通过 book_id 查询(+光标)借阅信息并更新每个结果。
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2021-04-05
    • 2018-08-24
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多