2012-07-27 130 views
0

我在使用MySQL數據庫存儲信息的PHP中編寫應用程序。它必須存儲的信息之一是一個名稱數組,但數組沒有設置長度。它可以從一個到多個項目。有沒有辦法將這個數組存儲在MySQL中,並能夠通過從數組中指定一個項目來檢索它?MySQL中的可變長度數組

例如,我希望能夠存儲這樣的一個表:

Foo  Bar 
------------------- 
[baz,car] fiz 
[abc,def] ghi 

然後,我希望能夠告訴MySQL只是搜索carSELECT第一行中的上面的表格。

有沒有一種可行的方法來實現這一點?

+1

規範化數據將使這種不必要的和你的生活輕鬆了許多 – 2012-07-27 02:02:53

回答

2

來實現它的方法是 「標準化」 的模式。有幾個相關的思想包含了模式規範化,但是關鍵的一點是你的數據應該用兩個表格和一個關係表示。這種關係被稱爲「一對多」,因爲對於一個「酒吧」來說,有一個或多個「Foo」。

然後,一個必要的步驟是向您的模式添加唯一標識符列(最簡單的方法是使用自動遞增整數),然後使用JOIN機制來查詢您的數據。

這就是爲什麼我們稱MySQL(和許多其他人)爲「關係」數據庫。

Bar 
+----+----------+ 
| id | name | 
+----+----------+ 
| 01 | fiz | 
+----+----------+ 
| 02 | ghi | 
+----+----------+ 


Foo 
+----+--------+----------+ 
| id | bar_id | name | 
+----+--------+----------+ 
| 01 | 01 | baz  | 
+----+--------+----------+ 
| 02 | 01 | car  | 
+----+--------+----------+ 
| 03 | 02 | abc  | 
+----+--------+----------+ 
| 04 | 03 | def  | 
+----+--------+----------+ 

而且這裏是聯接看起來像基於富的關係「有車族」選擇「FIZ」記錄

SELECT 
    Bar.* 
FROM Bar 
    JOIN Foo ON Bar.id = Foo.bar_id 
WHERE Foo.name = "car" 

如果你想美孚關係的整個列表每個條帶匹配富:

SELECT 
    Bar.*, 
    GROUP_CONCAT(Foo.name) 
FROM Bar 
    JOIN Foo ON Bar.id = Foo.bar_id 
WHERE Foo.name = "car" 
GROUP BY Bar.id 
+0

啊,所以這將是使用'unique'指數,RI的好地方GHT? – wecsam 2012-07-29 03:41:24

+1

是的,這兩個'id'列應該聲明爲'PRIMARY KEY',它強制執行一個唯一的約束。聲明可能如下所示:'id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY' – 2012-07-29 16:18:42

0

要麼

SELECT Bar FROM tbl 
WHERE FIND_IN_SET('car', Foo)