2017-04-03 17 views
2

數據存儲適合存儲真正長的文本,例如:個人資料說明和文章?在數據存儲中存儲長文本

如果不是,Google雲選擇是什麼?

如果是,那麼存儲它的理想方式是什麼才能保持格式,如換行符和減價支持的關鍵字?簡單地存儲爲字符串或轉換爲字節?我應該擔心臟的用戶輸入嗎?

我需要它的圍棋項目(我不認爲語言是相關的,但也許去有一些有用的功能這一點)

回答

4

是的,這是合適的,如果你有一定的侷限性確定。

這些限制是:

  • 整體實體尺寸(屬性+指數)不得超過1 MB(這應該是配置文件和大多數文章OK)
  • 文本超過一定限度(目前爲1500字節)不能被索引,因此實體可能會存儲更長的字符串,但是您將無法在其中搜索/將其包含在查詢過濾器中;不要忘了tag這些領域與"noindex"

至於類型,你可以簡單地使用string,如:

type Post struct { 
    UserID int64 `datastore:"uid"` 
    Content string `datastore:"content,noindex"` 
} 

string類型保留所有格式,包括換行,HTML標記和任何格式。

「髒的用戶輸入?」這是呈現/呈現數據的問題。數據存儲不會嘗試解釋它或試圖根據其內容執行任何操作,也不會對其進行轉換。所以從數據存儲的角度來看,你沒有什麼可擔心的(你不會通過追加文本來創建文本GQL,對吧?!)。

另外請注意,如果您要在您的實體中存儲大文本,每當您加載/查詢此類實體時都會提取這些大文本,並且您還必須在修改和(重新)保存此類實體時發送它實體。

提示#1:使用projection queries,如果你不需要某些查詢整個文本,以避免「大」數據移動(因此,最終加快查詢)。

提示#2:來「緩和」不能夠索引大文本的負擔,您可以添加重複的屬性,如大文本的簡短摘要或標題,因爲超過1500個字節的短string值可以索引。

提示#3:如果你想要去超過1 MB的實體大小限制,或者你只是想一般減少您的數據存儲規模使用情況,您可以選擇存儲壓縮內實體較大的文本。由於它們很長,所以無論如何都不能搜索/過濾它們,但它們壓縮得很好(通常低於原始的40%)。所以如果你有很多長文本,你可以通過存儲壓縮的所有文本,將數據存儲大小縮小到1/3。當然這會增加實體保存/加載時間(因爲你必須壓縮/解壓縮文本),但通常它仍然值得。

+0

你是我的英雄<3 ..關於noindex標記,我讀過的大多數文章[例如這個](https://cloud.google.com/appengine/docs/flexible/go/配置-datastore-indexes-with-index-yaml)使用yaml文件設置索引..但是你的代碼讓我懷疑是否也可以像剛剛那樣在結構中設置索引,例如'數據存儲: 「指數」'? – fisker

+0

@fisker您可以使用索引配置文件(例如'index.yaml')來定義_composite_索引。您在結構體字段的標記中指定的內容只會告知該屬性是否已編入索引(換句話說:如果實體是由該屬性編入索引的)。這是兩件不同的事情。 – icza

+0

如果我理解正確,那麼沒有必要指定'datastore:「,索引」',因爲這些字段已經利用了內置索引?因此,假設Post結構有一個Date和一個Tag字段,那麼就不需要做任何事情來過濾Tag字段,因爲它可以通過相等過濾器來實現,而對於Date字段,則推薦定義複合索引爲了執行按日期排序的過濾器? (對於脫離主題並利用你的光彩感到抱歉) – fisker