0

我知道GAE Datastore不是SQL,並且複合主鍵的概念不是與SQL的1:1映射。但我想我想創造一個像這樣的東西,並且正在尋找關於如何工作的共識。這裏是我的數據模型:Bigtable和複合主鍵

  • 汽車公司
    • 主鍵:公司名稱
  • 型號
    • 主鍵:公司名稱,型號名稱
  • 汽車
    • 主鍵:公司名稱,型號,VIN

在SQL中,對模型「公司名稱」和「型號名」將是我的主鍵(「公司名稱」,這也將是一個外國鍵)。然後Car將有一個複合外鍵Car(company name, model name) -> Model(Company name, model name)

ndb庫中,一個Key實際上是一組鍵/值對,但看起來與用於事務的祖先有關。我不需要交易(事實上,由於祖先將整個實體組限制爲每秒大約一次交易,所以我根本不想在這裏使用祖先)。所以我的問題是:

  1. 的事實是,一個關鍵是一組鍵值對來使用它作爲一個複合主鍵,相當於一個方法,或者它自動創建一個祖先的關係?是否有可能擁有一個帶有多個組件的密鑰而不使用祖先並限制我的事務處理速度?這些是無情地綁在一起,還是不相關,大多隻是一起使用?

  2. 人們通常如何在Google Datastore/Bigtable中處理這個概念?我可以通過將密鑰加入到一個字符串中(而不是像[Ford, Focus]這樣的列表,我可以像"Ford/Focus"那樣創建一個字符串)來僞造一個複合密鑰,那是大多數人做的事情嗎?

回答

1

要回答你的兩個問題:

  1. 我不熟悉ndb但在按鍵數據存儲是由一種-ID(長)或種類名稱的層次結構(字符串)對。所以,是的,創建這組鍵 - 值對將強加實體組,這樣Car就會在Model的實體組中,這個實體組將在Car Company的實體組中。 This page更詳細地解釋。

  2. 您的數據模型將取決於您想如何查詢並更新它,但值得注意的是Datastore不會對您的數據施加任何約束,您的應用程序將需要這樣做。所以,是的,創建一個唯一的字符串,如ford.focus可能是創建模型標識符的一種方法。然後,您可以使用諸如ford.focus.12345之類的內容作爲汽車標識符。或者,您可以讓Datastore自動爲您創建一個Long ID,然後讓您的Car實體在其Model中存儲一個Key,這樣Key就可以擁有一個Key來引用其Car Company實體。您可能希望在標準化方面有一些冗餘,並且在Car實體中同時擁有Model和Car Company的鑰匙 - 同樣,這取決於您需要查詢/獲取哪些數據以及多久。

要記住的重要一點是,按鍵提取比查詢要好,所以您的應用程序的需求將影響您的實體模型。

+0

「要記住的重要一點是,通過密鑰提取比查詢要好」這正是我提出問題的動力,是的。謝謝! – 2014-10-07 09:26:02