2013-01-03 71 views
0

很簡單塞納里奧:獨特的鍵/屬性/屬性在ZODB

class User(Persistent): 
    def __init__(self, username, email): 
    self.username = username 
    self.email = email 

我想通過自己的用戶名的用戶實例存儲在ZODB,同時保持電子郵件獨一無二的。

u1 = User(username="u1",email="[email protected]") 
zodb_container[u1.username] = u1 

我使用用戶名作爲密鑰來存儲這個對象,所以它將是唯一的。我的問題是如何保持電子郵件屬性的獨特性?在對象數據庫中有沒有優雅的方法來做到這一點?

回答

2

編號

ZODB有點不正確。它不像Postgres那樣是一個「數據庫」,或者MySQL是一個具有約束和查詢語言的數據庫,以及人們假定數據庫具有的所有東西。相反,它是一個持久對象存儲。除了管理大於可用內存的工作集,處理事務,並允許您在進程之間共享對象表示形式之外,ZODB沒有爲您做任何事情,因爲Python的pickle模塊不適合您。它實際上是「超級按鈕」。

所以,如果你真的問過關於泡菜的相同問題,你的答案就沒有什麼不同了。

+0

嗨克里斯,非常感謝你!我想知道你什麼時候符合這樣的要求,你如何解決這個問題,以及推薦的做法是什麼?我現在有兩個選擇:1,將ZODB與真正的關係數據庫結合起來。 2,在ZODB中創建另一個字典並使用電子郵件地址作爲密鑰。所以我維護兩本詞典以保持用戶名和電子郵件地址的唯一性。 – Xiong

+0

假設我選擇第二個選項,我還有另一個問題:如果我在兩個字典中兩次保存相同的用戶對象,ZODB會保留該用戶對象的兩個副本還是隻保留一個副本?如果ZODB保留兩個副本,那麼我必須保存一個鍵(User.username)而不是整個User對象。順便說一句,我想我最好馬上做一個實驗。 – Xiong

+0

ZODB只保留用戶對象的一個​​副本。所以我打算使用兩個字典來保持這兩個屬性的唯一性。 – Xiong