簡體   English   中英

你怎么不加入?

[英]How do you not do joins?

我最近一直在閱讀有關數據庫查詢中的連接如何減慢速度的問題。 顯然,Google App Engine甚至不允許使用它們。

我想知道人們如何設計一個沒有連接的應用程序。 例如,我正在開發一個有contactsorganizations的應用程序。 聯系人可以在許多組織中,組織可以有許多聯系人。 如果沒有連接兩個實體的第三個表,那怎么可能有這種關系......

contacts --< contacts_organizations >-- organizations

這是否意味着在GAE中你不能擁有多對多的關系? 您只是遺漏了需要加入的功能?

我想你可以在contacts表中有一個TEXT organizations列,其中包含每個聯系人的組織ID的空格分隔列表。 這看起來有點奇怪。

加入速度慢的軟件是一種神話,就像在應用程序代碼中斷言寫入循環減慢軟件一樣神話般的神話。

我的意思是,為什么要寫一個循環? 這只是一次又一次地運行相同的代碼行! 還不夠嗎? 這是一個巨大的浪費!

上述陳述具有諷刺意味。

我的觀點是,查詢包含一個用於目的的連接:獲得正確的答案。 低效或不必要地使用連接當然是糟糕的設計,比如將循環不變代碼放在循環中。

避免連接作為一般策略是過早優化的一個例子。 如果您編寫高效代碼的方法是提出類似的一攬子規則,那么避免連接並不會對您有所幫助。


至於Google App Engine,它確實支持實體之間的關系,但由於它不是嚴格意義上的關系數據庫模型,因此連接的概念並未真正出現。 相反,您可以從給定引用獲取相關實體,這更像是模型的ORM接口,它與SQL中的連接不同。

您可以在此處閱讀更多內容: http//code.google.com/appengine/articles/modeling.html

(該鏈接在此主題的另一個答案中,但已被刪除)

挑選點:Google不會在其數據庫中禁止使用JOIN來阻止用戶運行“昂貴”的查詢; 數據庫不是關系型的,因此“JOIN”SQL動詞首先不適用。

通過這種方式,BigTable與Amazon的SimpleDB相同 - 數據被非規范化並剝離了模式,因此您可以有效地使用存儲桶中允許的任意數據的巨大,高效的哈希表。

這些哈希表非常容易擴展,特別是與關系數據庫相比。 對於像GAE這樣的應用,極端可擴展性比完整功能集更高。

您可以使用db.ReferenceProperty鏈接對象,有關詳細信息和示例,請參閱Google App Engine:One-to-many JOIN

通常,當您談論不允許連接的數據庫時,您談論的是非常大的數據庫,它們不一定適合一台服務器。 最近的例子是亞馬遜的SimpleDB微軟的SQL數據服務谷歌的App Engine數據存儲等雲數據庫。 有些提供有限的連接功能,但最大的困難是跨“ 分區 ”進行連接。 在像這樣的大型數據庫中,您對數據進行分區,使其不必駐留在同一服務器上。 你必須決定分區的正確方法。

在您的示例中,我將在聯系人表中的字段中存儲組織鍵列表,反之亦然。 這些數據庫的設計與典型的規范化數據庫不同。 這些表通常是“稀疏表”,這基本上意味着每個記錄可以具有任意數量的字段,這些字段基本上是名稱/值對。 想想亞馬遜上的產品表,以及不同類型產品可能有多少個不同的字段。 書籍有多少頁面,但MP3有持續時間。 在稀疏表中,這些記錄將存儲在同一個表中。

我認為谷歌正在試圖利用一些計算量很大的機制,因此你將尋找利用更多其他資源的方法,例如硬盤維護參考表和/或計數表而不是CPU周期浪費連接和聚合計算。

這並非不可能,您只需要使用其他類型的資源來幫助您解決問題。

您可以在應用程序而不是數據庫服務器中執行連接,方法是分別從每個表中獲取結果然后將它們組合在一起,但對於大多數連接而言,這樣做只會因為進行多次數據庫往返而導致的延遲而減慢速度一。

但是:誠實的事實是連接不是你的問題。 到他們的時候,如果有的話,你甚至不需要問這個問題。 您可以計算在您的手指(主要是Ebay)上達到這一點的現實生活項目的數量,並且沒有證據表明完全消除連接是這些項目可以擴展的唯一方式。

您提到的數據庫充其量只是版本化的記錄存儲,旨在跨多個服務器存儲大量數據。 稱他們為“數據庫”將是一個延伸。 不支持連接,也不支持ACID事務,回滾等。您可以在沒有它們的情況下編寫應用程序,但通常需要做更多工作來提供功能。

對於:

contacts --< contacts_organizations >-- organizations

您可以在組織中以聯系人和聯系人的形式發布和存儲組織。 但是,您必須在應用程序處理中強制執行引用完整性,同時更新到兩個表。

更好的解決方案是將數據存儲在三個表中並自己進行“連接”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM