管理 Google 云数据存储中实体内的嵌套实体列表

Manage nested list of entities within entities in Google Cloud Datastore

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

我希望数据库架构如下:

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

users:
 name:
 borrowed:
  timestamp:
   book_id

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

我定义了两种:BooksUser

业务逻辑:

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

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

总的来说,这不是一种可扩展的方法:每次用户借书时,您都必须 re-write userbook 实体,这将逐步得到由于两个实体都将继续增长,因此速度较慢。

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

borrowed_book:
  book_id
  user_id
  timestamp

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

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

也尽量不要被祖先混淆 - 建立关系不需要它,参见