2011-02-07 120 views
5

我爲我的CMS添加了一個新功能到我的用戶模塊,並且我碰到了一個障礙......或者我猜想,這是一條叉路,我希望在我承諾之前從stackoverflow得到一些意見任何東西。
基本上我想允許管理員添加新的'額外'用戶字段,用戶可以在註冊時填寫,編輯他們的配置文件,和/或由其他模塊控制。一個例子就是生日字段,對自己的長篇描述,或者用戶在網站上獲得的積分。不用說,存儲的數據將會變化,並且可以從大量文本到小整數值。更糟糕的是 - 我希望可以選擇搜索這些數據。在MySQL中存儲「額外」用戶數據的最佳方法?

這樣就行了 - 最好的辦法是什麼?現在我傾向於擁有一張帶有以下列的表格。

userid, refFieldID, varchar, tinyint, smallint, int, text, date, datetime, etc. 

我寧願這個,因爲它會使顯著搜索速度更快,並參考表(它包含所有字段的數據,如字段名的,不管是搜索還是沒有等)在存儲該字段的數據時應參考使用哪一列。

另一個想法,這是我建議和我見過的其他解決方案中使用(vBulletin是一個,雖然我看到別人的名字逃脫我在這一刻),你剛纔有用戶名,參考ID ,和medtext字段。我對MySQL的確切知之甚少,但這種方法似乎會讓搜索速度變慢,並且可能會有更大的開銷。

那麼哪種方法是'最好的'?我還有其他方法嗎?無論我最終使用哪種方法,它都需要快速搜索,而不是大規模(只需少量開銷即可),並且最好允許針對數據使用複雜的查詢。

回答

3

我同意鍵值表可能是最好的解決方案。我的第一個想法是隻存儲一個文本列,就像vBulletin一樣。但是,如果你想添加的能力,爲數據存儲是有點更具擴展性和可搜索,就像你擺出來,我可能會建議:對於任意的文本

  • 1中/ LONGTEXT或中等/ LONGBLOB場/二進制存儲(無論是存儲+字符串長度爲3-4字節的開銷)。只有選擇中長期的理由是將可以存儲的內容限制爲2^24個字節(16.7 MB)與2^32個字節(2 GB)。
  • 1整數(4個字節)或BIGINT(8個字節)
  • 1的日期時間(8個字節)
  • 也許1 float或double(4-8字節)浮點存儲

這些字段將允許您在表格中存儲幾乎任何類型的數據,但不會擴大表格**的寬度(如varchar),並避免任何冗餘存儲(如使用tinyint和mediumint等)。存儲在longtext字段中的文本仍然可以使用全文索引或常規有限長度索引(例如index longtext_storage(8))進行合理搜索。

**所有blob值(如longtext)都獨立於主表存儲。

+0

哇謝謝,我實際上會回覆第一個同意#1的人,哪個列可以選擇 - 但我想我不必再去了:)。關於你的帖子 - 你的意思是文字和blob,int和bigint?或者一個或另一個?另外,如何添加'bool'(tinyint(1))列?我可以看到它非常有用,並且可能用得很多 - 在你看來,值得保存3個字節嗎? 另外,列數是否會增加磁盤上某一行的大小?當然空列。我不懷疑你的(驚人的)桌面佈局,只是好奇而已。 – Jon 2011-02-07 04:05:44

0

可能適用於您的一種技術是將此任意數據以文本形式存儲,如JSON,XML或YAML。這個決定取決於你如何訪問數據:如果你只查看每個用戶的全部用戶數據,它可能是理想的。如果您需要在用戶數據的特定字段上運行SQL查詢,則需要使用純SQL或混合方法。許多新的高度可擴展的「NoSQL」系統似乎都傾向於使用JSON數據(例如,MongoDB,CouchDB和Project Voldemort)。它很好也很簡潔,您可以創建任意複雜的結構,包括地圖(JSON對象)和列表(JSON數組)。

相關問題