2011-09-10 79 views
2

SEE:http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false數據庫設計:保存谷歌地圖數據

我正在使用MySQL。

鑑於部分或完整的地址,谷歌地圖API將返回這樣的事情:

"address_components" : [ 
      { 
       "long_name" : "1600", 
       "short_name" : "1600", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Amphitheatre Pkwy", 
       "short_name" : "Amphitheatre Pkwy", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Mountain View", 
       "short_name" : "Mountain View", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Santa Clara", 
       "short_name" : "Santa Clara", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "California", 
       "short_name" : "CA", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "94043", 
       "short_name" : "94043", 
       "types" : [ "postal_code" ] 
      } 
     ] 

假設我開發一個應用程序,其中:

  1. 帳戶擁有者可以指定自己的位置,並
  2. 按位置搜索支持

如何我應該存儲從Google獲得的地址組件,以便我可以查詢以下內容:

  1. 特定國家/地區有多少個帳戶所有者?
  2. 特定州有多少個帳戶所有者?
  3. 特定ZIP /郵政編碼中有多少個帳戶所有者?

一個非常簡單的方法是單獨的地址組件存儲在一個表:

TABLE: account 
- account_id (PK) 
- street_number 
- route 
- locality 
- administrative_area_level_2 
- administrative_area_level_1 
- country 
- postal_code 

我就留空的任何信息穀歌不提供(例如,如果帳戶擁有者做不提供街道號碼,那麼Google API也不會返回street_number)。我認爲這將是最簡單的查詢。但是,這些數據不會被標準化。

另外,我也可以設計數據庫有多個表,例如:

TABLE: country 
- country_id (PK) 
- name 

TABLE: administrative_area_level_1 
- administrative_area_level_1_id (PK) 
- country_id (FK) 
- name 

...等等

這可能會恢復正常的數據,但可能是一個痛苦的查詢。此外,缺少的信息也可能導致一些問題。例如,如果Google返回countryadministrative_area_level_2,跳過administrative_area_level_1(我不確定這是否可能)? administrative_area_level_2將需要一個administrative_area_level_1_id作爲它的FK - 如果沒有它,模型會中斷。

另一個想法可能是使用嵌套集或鄰接模型。數據將被標準化,並可能能夠更好地處理缺失的信息。

我的直覺是最簡單的模型 - 允許冗餘數據的模型 - 對我來說是最好的選擇。數據不是來自我的,它來自谷歌和我認爲我只需要數據,所以我可以做這些按位置搜索搜索。也許我不會遇到異常?

關於如何建模的建議?

回答

2

在開始擔心如何建模從Google地圖中檢索的數據之前,您可能需要首先查看服務條款http://code.google.com/apis/maps/terms.html。 特別注意10.1.3(a):

「您不得複製,翻譯,修改或創建衍生作品(包括創建或貢獻數據庫)或公開展示任何內容或任何內容部分...「

我會說,幾乎明確地禁止你正在試圖建立的那種應用程序。如果您想查詢Google針對您的某個帳戶所有者的地址信息,則必須使用Google的API完成此操作,而不是複製其數據並在自己的應用程序中執行。

+0

Alastair,請忽略TOS(可能違反它)的問題並嘗試解決數據建模問題。使用不同的映射服務會發生同樣的一般問題。此外,在某些情況下,似乎可以存儲Google地圖數據:http://code.google.com/apis/maps/articles/geocodestrat.html#caching – StackOverflowNewbie

+0

如果您問這是數據建模問題一個抽象的感覺,這本來是很好的,但鑑於你說過你想要專門爲了開發一個違反法律的應用程序而需要答案,我當然不會幫你進一步。緩存是一種非常具體的用例,只有在「暫時,安全且不允許在外部使用內容」的情況下,才允許「有限數量的內容用於提高Maps API實現的性能」服務「(ToS 10.1.3b) - 不包括您的用例。 –

+0

感謝您的時間。順便說一句,谷歌的TOS不是法律。而我的問題仍然是一個數據庫建模問題。 – StackOverflowNewbie