2012-02-06 102 views
0

全部,MySQL - 如何存儲未知和不同大小的輸入?

我想創建一個表來接收用戶輸入(UGC)。這個內容的大小可以從單個字符到幾百個字。輸入將在utf8_unicode_ci中編碼,並且可以是拉丁字符或多字節字符。

輸入將要被搜索。

(從長期來看,我可能想存儲非文本對象 - 圖片之類的,但現在讓我們專注於UTF8文本。)

在這一點上,我只是構想2個字段的表:一個ID(自動增量INT(10))和UGC本身。 (我可能需要一些更多的領域,如dateAdded等)

我應該如何構建我的數據庫,允許靈活性和性能之間的良好折衷?我可以......

  1. 設置一個上限,對字符串的大小,並利用性能&可用性命中。
  2. 創建不同尺寸範圍(最終類型的)幾個表,並通過表名和ID的組合識別每件物品(所以我需要有唯一的ID,表名,表特定的ID中央表)。
  3. 我可以單獨存儲每一個對象,只是有DB店的URL。我懷疑這最終會成爲#2效率較低的版本,但我已經超出了我的深度。

謝謝

JDelage

+2

該UGC的任何部分都被認爲是可搜索的嗎? – 2012-02-06 22:47:46

+0

@Eugen Rieck - 是的,好點。我會編輯我的問題。 – JDelage 2012-02-06 23:07:53

回答

1

有一個很好的經驗法則 - 和拇指的所有規則是遠遠不夠完善 - 這一直工作得很好我:

  • 如果DB「理解」的潛在內容BLOBy場,將其存儲在數據庫中
  • 如果DB沒有對內容的理解,至今保存它的外部

有了這一點,我的經驗這一點,我勸阻圖像等使用BLOB字段。

現在的內容想着的時候,可以是文本,圖像或什麼的,我敢肯定你的業務邏輯需要一些領域,告訴它如何反正用大字段的內容 - 這是很難想象一個應用程序的在查看數據之後,會將圖像視爲圖像。所以我建議你創建這樣的領域,mimetype會想到,並且一個,說,mediumtext領域。您的應用業務邏輯很容易推斷出,mimetype='text/plain'意味着文本字段中的數據是有效負載,而mimetype='image/png'意味着文本字段中的數據是文件資源的(相對)路徑。

如果您以某種方式創建文件路徑,那麼這不會成爲任何語言的單詞,這使您可以在內容上進行搜索和索引,錯誤匹配的可能性很低。想起了MD5(basename).suffix

1

既然你也提到了有關存儲的圖片,建議使用BLOB類型的非文本。 http://dev.mysql.com/doc/refman/5.0/en/blob.html

如果此表使用URL方法佔用內容,並且CDN也可能有效,但很明顯,您正在處理額外成本和一些編程工作來處理CDN。

1

對於你在尋找一個varchar什麼某些方面似乎是最好的選擇,但是當涉及到存儲的圖片或二進制對象就不會那麼好,除非你將其存儲在文件系統上,並使用該字段來保存對象的路徑。否則,您可能需要使用varchar和blob字段。