我同意雷纳托。你基本上有一个多对多的场景。作者可以写几本书,相反,书可以有多个作者。
不幸的是,Google Datastore中没有多对多关系的显式机制。但是你仍然可以构建你的实体来建模关系。
例如,而不是使用通过祖先路径的层次模型,添加一个数组来存储引用作者的实体按键,可能是这个样子你的书的实体:
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
如果你想知道与笔者李四在你的数据库相关联的所有你需要做的就是查询“作者”数组属性的所有书籍:
query = Google::Cloud::Datastore::Query.new
query.kind("Book").
where("authors", "=", datastore.key("Author","john"))
books_by_john = datastore.run query
请注意,我本可以走另一条路,并在作者实体上创建一个Book键数组。但是,如果我走了这条路线,并试图模仿一个多产的作家,比如说说斯蒂芬·金......那么作者实体最终会因为对图书实体的关键引用而变得非常臃肿,所以你必须对关系的哪一方进行选择你添加数组并尝试寻找不太可能膨胀的实体。