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

时间:2018-03-12 15:59:07

标签: google-cloud-datastore

我是Datastore的新手,我正在尝试创建一个跟踪借书的简单应用程序。

我希望数据库架构如下:

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

users:
 name:
 borrowed:
  timestamp:
   book_id

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

我定义了两种:BooksUser

业务逻辑:

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

基本上,当用户借书时我想要进行以下两次插入:

  • 新的借用条目附加到Book类型的图书实体,当前时间戳为关键字,user_id,firstname和email为属性
  • 新的借用条目附加到ty User的用户实体,当前时间戳为密钥,book_id为属性

如何使用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"
                }
            }
        },
        ...
    }
}

1 个答案:

答案 0 :(得分:2)

一般来说,这不是一种可扩展的方法:每次用户借书时,您都必须重写userbook实体,这些实体会逐渐变慢。两个实体都将继续增长。

我建议采用不同的方法:在您的架构中添加新类型,让我们称之为borrowed_book,代表用户的书:

borrowed_book:
  book_id
  user_id
  timestamp

现在,每当用户借书时,您只需创建一个borrowed_book实体,同时指向bookuser。对userbook实体没有任何更改。 不需要嵌套

附注:我将firstnameemail属性置于user实体类型下,它们并不真正属于借用事件每次同一用户发生此类事件时都会重复。

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