管理 Google Cloud Datastore 中实体的嵌套实体列表



我是数据存储的新手,我正在尝试创建一个简单的应用程序来跟踪书籍借阅。

我希望数据库架构如下:

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

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

我定义了两种类型:BooksUser

业务逻辑:

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

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

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

如何使用数据存储实现此目的(管理嵌套列表子项(?通过嵌入式实体?家长参考?

以下是我期望的示例:

{
  "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"
                }
            }
        },
        ...
    }
}

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

我建议一种不同的方法:向你的模式添加一个新类型,我们称之为borrowed_book,表示由用户嘘声的书:

borrowed_book:
  book_id
  user_id
  timestamp

现在,每次用户借书时,您只需创建一个这样的borrowed_book实体,同时指向bookuser。对userbook实体没有更改。并且不需要嵌套

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

也尽量不要被祖先混淆 - 建立关系不需要,请参阅Google App Engine(Python(中的电子商务产品类别

最新更新