0

我剛剛開始關注非關係數據庫,所以我想問一些將這些傳統SQL/django模型轉換爲Google的幫助App Engine模型。取消規範化數據模型:django/sql - >應用引擎

該示例適用於活動列表,其中每個活動都有一個類別,屬於一個場地,並且場地上附有許多照片。

在Django,我會模擬這樣的數據:

class Event(models.Model) 
    title = models.CharField() 
    start = models.DatetimeField() 
    category = models.ForeignKey(Category) 
    venue = models.ForeignKey(Venue) 

class Category(models.Model): 
    name= models.CharField() 

class Venue (models.Model): 
    name = models.CharField() 
    address = models.CharField() 

class Photo(models.Model): 
    venue = models.ForeignKey(Venue) 
    source = models.CharField() 

我將如何實現與App Engine車型相同呢?

回答

1

這裏沒有什麼必須被取消規範化才能與App Engine一起使用。您可以將ForeignKey更改爲ReferenceProperty,將CharField更改爲StringProperty,將DatetimeField更改爲DateTimeProperty並完成。將類別存儲爲字符串而不是引用可能更有效,但這取決於使用情況。

當您開始設計查詢時,非規範化變得非常重要。與傳統SQL不同,您不能編寫可訪問每個表的每一行的即席查詢。任何你想查詢的東西都必須由索引來滿足。如果您今天正在運行依賴於表掃描和複雜聯接的查詢,則必須確保查詢參數在寫入時編入索引,而不是實時計算它們。

作爲一個例子,如果您希望按事件標題進行不區分大小寫的搜索,則必須在寫入時在每個實體上存儲標題的小寫副本。沒有猜測您的查詢要求,我無法提供更具體的建議。

+0

非常有幫助,謝謝! – Hoff

0

有可能在App Engine上運行Django的

你需要的應用程序從這裏三重奏: http://www.allbuttonspressed.com/projects

  • Django的nonrel
  • djangoappengine
  • djangotoolbox

另外,這個模塊使它成爲可能做跨不直接通過數據存儲方法支持外鍵關係的聯接:

  • Django的dbindexer

...它denormalises你想加入對抗領域,但有一定的侷限性 - 不自動更新非規格化值,因此僅適用於靜態值。

Django信號爲自動非規範化提供了有用的起點。