我正在嘗試使用GAE數據存儲進行一些練習,以獲得關於查詢和帳單機制的感受。GAE數據存儲 - 當寫入數量多於讀取數量時的最佳實踐
我已閱讀了關於GAE的Oreilly書,並觀看了關於數據存儲區的Google視頻。我的問題是,最佳實踐方法通常涉及更多的讀取操作,而不是寫入數據存儲區。
我建了一個超級簡單的應用程序:
- 有兩個網頁 - 一個 選擇鏈接,以及一個視圖選擇 鏈接
- 每個用戶都可以選擇URL鏈接添加到自己的「鏈接供稿「
- 用戶可以隨時選擇他想要的任意數量的鏈接。
- 在不同的網頁上,我想向用戶展示他選擇的最近10個鏈接。
- 每個用戶都有自己的「鏈接Feed」網頁。
- 每個「鏈接」我想保存並顯示一些元數據 - 例如:url鏈接本身;當它被選中時;飼料已經出現了多少次;等
在這種情況下,因爲用戶可以選擇他想要儘可能多的聯繫,只要他想,我的應用程序寫入到數據存儲,比數量更讀(寫 - 當用戶選擇了另一個鏈接;讀 - 用戶打開網頁時,看到他的「鏈接飼料」)
問題1: 我能想到的(至少)兩個選項如何處理數據爲這個應用程序:
選項A: - 與用戶維護每個用戶的實體詳細信息,登記等 - 每個用戶保存他的近10間選擇的聯繫,他問之後,將呈現給用戶的網頁維護另一個實體爲它
選項B: - 維護每個URL鏈接實體 - 這意味着所有用戶的所有網址將被存儲爲相同的對象 - 保持實體每個用戶的詳細信息(與選項A相同),但在網址的大表中添加對用戶網址的引用
什麼會是更好的方法嗎?
問題2: 如果我要算的網址總數選擇,直到今天,還是用戶選擇的URL的每日量,或其他任何計數 - 我應該用它與我的SDK工具,還是應該我在上述實體中插入計數器? (我想,以減少數據存儲量爲寫盡我所能)
編輯(應答@埃拉德的評論): 假設我想只保存每用戶10頁最後的URL。其他人我想擺脫(所以不要過度填充我的數據庫與不必要的數據)。
編輯2:添加代碼之後 所以我做了下面的代碼在try(嘗試第一埃拉德的方法):
這裏是我的類:
class UserChannel(db.Model):
currentUser = db.UserProperty()
userCount = db.IntegerProperty(default=0)
currentList = db.StringListProperty() #holds the last 20-30 urls
然後我序列化的網址&將元數據轉換爲JSON字符串,用戶從第一頁開始POST。 這裏的POST被如何處理:
def post(self):
user = users.get_current_user()
if user:
logging messages for debugging
self.response.headers['Content-Type'] = 'text/html'
#self.response.out.write('<p>the user_id is: %s</p>' % user.user_id())
updating the new item that user adds
current_user = UserChannel.get_by_key_name(user.nickname())
dataJson = self.request.get('dataJson')
#self.response.out.write('<p>the dataJson is: %s</p>' % dataJson)
current_user.currentPlaylist.append(dataJson)
sizePlaylist= len(current_user.currentPlaylist)
self.response.out.write('<p>size of currentplaylist is: %s</p>' % sizePlaylist)
#whenever the list gets to 30 I cut it to be 20 long
if sizePlaylist > 30:
for i in range (0,9):
current_user.currentPlaylist.pop(i)
current_user.userCount +=1
current_user.put()
Updater().send_update(dataJson)
else:
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('user_not_logged_in')
,其中更新是我與通道API更新網頁與飼料法。我可以看到每個用戶都有一個帶有20-30個鏈接的ListProperty(當它打到30個時,我用pop()將它縮小到了20個),但!!!!!!!!!!!!!!!。。。。。。。。。。。。。。。。。。。。。。價格相當高... 每個郵政像這裏一個需要〜200ms,121 cpu_ms,cpm_usd = 0.003588。這是非常昂貴的考慮到我所做的就是將一個字符串保存到列表中... 我認爲問題可能是實體與大ListProperty變大了嗎?
從您的問題中不清楚您是要保存用戶選擇的所有網址,還是隻保存最近的20個網址,並丟棄較舊的網址。你能澄清嗎? – Elad 2011-04-09 08:14:36
Elad你是對的。這是兩種不同的情況。我用你評論的內容更新了我的問題。 – 2011-04-09 08:33:13
太棒了 - 這使得它更簡單 - 見下面我的答案。順便說一句,出於純粹的好奇心,應用程序是什麼?爲什麼我想要保存一些URL,但只看到最後10個? – Elad 2011-04-09 12:57:15