2010-01-27 124 views
0

我使用分隔符(例如「1,5,10」)和TEXT數據類型將多個數字存儲在MySQL單元格中。在MySQL中的單個單元格中存儲多個值

如何執行此類查找?

SELECT * FROM MyTable WHERE MultiVals CONTAINS "5" 

最後,這是存儲這些值的首選方法嗎?我使用它就像鏈接器表一樣,將某些行鏈接到另一個表中的多個其他行(通過ID)。由於我試圖儘量減少數據庫的文件大小,我認爲這將是一個更緊湊的方法來連接,而不是使用另一張表是這樣的:

Person ID  Product ID 
-----------  ----------- 
3    1 
3    2 
3    3 
7    5 
7    7 
+0

你爲什麼要儘量減少db的文件大小? – Vnuk 2010-01-27 08:23:05

+0

哈哈。有沒有建立任何可擴展的?詢問您的系統管理員他們認爲企業存儲成本有多少。 – 2010-01-28 09:06:41

回答

3

它建議之間創建一個第三所謂的映射表兩個鏈接表具有兩個外鍵ID列。

Project ID  Tag ID 
-----------  ----------- 
3    1 
3    2 
3    3 
7    5 
7    7 

使用這些,這兩個外鍵也充當索引。因此,與FIND_IN_SET方法相比,它將顯着加快查找速度。 您正在最小化文件大小,因爲TEXT數據類型爲未使用的位保留空白空間,而數字存儲空間最好,並使用最少的本地存儲空間。

無論如何,如果你想保持原來的方式,你去這樣的:

SELECT * FROM MyTable WHERE FIND_IN_SET(5,MultiVals) >0 

這將確保該值可以用逗號太值5將只匹配「5」相匹配,而不是「15」

+1

它被稱爲複合表,傳統上命名爲「C_TABLE1_TABLE2」。 – amphetamachine 2010-01-27 07:59:12

+1

這是可疑的你如何學習它,我們將它命名爲map_table1_table2 :) – Pentium10 2010-01-27 08:01:52

+0

如何在MySQL中配置外鍵?我是否將這些列標記爲「索引」? – 2010-01-27 08:04:47

1

如果可能,請儘量避免這種情況,因爲它違反了數據庫規範化規則,並且難以對這些值進行索引。您的值可以保存在單獨的查找表中或類似的地方。

如果你真的別無選擇,只能採用這種設計的生活,那麼你就可以查詢值如下:

select * from mytable where concat(',', multivals, ',') like '%,5,%' 

這將超過瑣碎的數據等,或寫什麼最有可能殺性能一個將行分割的函數(根據分隔符「,」)並檢查結果數組,或者使用全文索引。

編輯:在find_in_set操作比使用like更優雅,雖然我不知道因爲它是如何在幕後執行。

0

這是一個壞主意,像其他職位說,但你仍然可以使用一個簡單的regex

.. where field RLIKE '(^|,)5($|,)' 
2

你不應該執行它。您應該創建一個鏈接到myTable並保存行中值的表格。原因有很多,你應該這樣做,但我個人最喜歡的是 - 考慮對未來的投資。

使用您的分隔數據,遲早會遇到問題,無論是由於負載增加還是大量數據。

與任何其他關係數據庫一樣,MySql在搜索int等時比在字符串周圍搜索要快。不用提,字符串索引花費更多的資源來維護它們。所有說,如果你不打算做任何嚴肅的sutff(至少在MyTable中的數百萬記錄或在一個MultiVal字段中超過50個值),你可以繼續做你現在正在做的事情。 - 你不會看到任何性能增益。

相關問題