我同意雷纳托的观点。你基本上有一个多对多的场景。一个作者可以写几本书,相反,书籍可以有多个作者。
很遗憾,Google Datastore 中没有明确的多对多关系机制。但是您仍然可以构建实体来对关系建模。
例如,不是通过祖先路径使用分层模型,而是向您的 Book 实体添加一个数组,该数组存储引用 Author 实体的键,这些键可能如下所示:
book_key = datastore.key "Book"
author_key1 = datastore.key "Author", "john"
author_key2 = datastore.key "Author", "jane"
author_entity1 = datastore.entity author_key1 do |t|
t["name"] = "Doe, John"
end
author_entity2 = datastore.entity author_key2 do |t|
t["name"] = "Doe, Jane"
end
datastore.save(author_entity1, author_entity2)
Book 实体上的数组属性看起来像这样:
book_entity = datastore.entity book_key do |t|
t["authors"] = [author_key1, author_key2]
end
如果您想知道数据库中与作者 John Doe 相关的所有书籍,您只需查询“authors”数组属性:
query = Google::Cloud::Datastore::Query.new
query.kind("Book").
where("authors", "=", datastore.key("Author","john"))
books_by_john = datastore.run query
请注意,我也可以另辟蹊径,在 Author 实体上创建 Book 键数组。但是我是否走那条路并尝试为多产的作者建模,比如斯蒂芬金......那么作者实体最终会因对书籍实体的关键引用而变得非常臃肿,所以你必须选择关系的哪一方您添加数组并尝试寻找不太可能膨胀的实体。