2012-08-01 64 views
0

我試圖讓我的頭繞Cassandra/Pycassa db設計。Pycassa中的ReferenceField的等效參數?

隨着Mongoengine,你可以參考使用「ReferenceField」另一個類,如下所示:

from mongoengine import * 

class User(Document): 
    email = StringField(required=True) 
    first_name = StringField(max_length=50) 
    last_name = StringField(max_length=50) 

class Post(Document): 
    title = StringField(max_length=120, required=True) 
    author = ReferenceField(User) 

據我可以從文檔知道的,Pycassa相當於是這樣的,但我不」知道如何創建用戶類從郵政類的作者字段的引用:

​​

什麼是做這樣的事情的首選方式是什麼?很明顯,我可以將用戶密鑰放在帖子作者字段中,但我希望有一些更好的方式將所有這些內容在幕後處理,例如Mongoengine。

回答

1

@jterrace是正確的,你可能會以錯誤的方式去做。藉助卡桑德拉,你不會對物體,物體之間的關係以及如何使物體標準化。相反,你必須問自己:「我需要什麼樣的查詢纔能有效地回答?」,然後預先爲這些查詢建立答案。這通常涉及非規範化和「寬行」模型的混合。我強烈建議你閱讀一些關於Cassandra在線數據建模的文章。有了這個說法,pycassa的ColumnFamilyMap只是一個薄的包裝,可以減少樣板,僅此而已。它不會試圖提供任何複雜的支持,因爲它不知道你需要回答哪種查詢。因此,具體而言,您可以將匹配的用戶的LexicalUUID存儲在作者字段中,但當您獲取Post對象時,pycassa不會爲您自動獲取該用戶對象。

1

我認爲你真的誤解了Cassandra的數據模型。在繼續之前,您應該閱讀Cassandra Data Model

pycassa沒有像上面定義的「對象」的概念。只有列族,行鍵類型和列類型。在Cassandra中,不存在從一個專欄家族到另一個專欄家族的參考。

+0

是的,我昨天已經閱讀了這篇文章,但不幸的是,它的例子並不是特別有利於給我一個整體感覺,因爲你是如何設計圍繞Cassandra的系統的。 我看到做我想要的而沒有引用的唯一方法是複製數據庫中的大部分數據。這對我來說似乎並不特別有效。 (我知道,在這種情況下,這可能只是我所做的事情甚至不適合Cassandra,但我懷疑我會被其他人強制使用它)。 – paul88888 2012-08-02 03:05:33

相關問題