2008-10-09 40 views
7

我想知道這是否可行?將數組插入數據庫中的一個字段。將數組插入到單個數據庫中

例如我有一個標題,我想只有一個ID的標題,但它會在網站上雙擊使用。

讓另一張表具有其全局ID,然後再將另一張表與實際標題以全局ID鏈接到表上,這感覺有點不必要。

我只是想有這樣的事情

ID  TITLE 
1  Array("english title", "nederlandse titel"); 

我使用PHP/MSYQL,因此,如果這將是可行的請您用這些語言解釋。

哦,是的,我想我可以格式化它的時髦,並使用拆分功能再次變成一個數組。但我不知道如果我可以將其存儲爲一個數組馬上,我情況下,用戶可以鍵入格式相同的東西(一出一百萬)

回答

14

這是可行的:

$title = serialize($array); 

,然後解碼:

$title = unserialize($mysql_data); 

但提到它確實減輕擺在首位數據庫的好處。我肯定會建議尋找一個多表或多列選項,取決於你想支持的語言的數量,並且如果這個數字將來會改變。

編輯:dcousineau提到一個很好的點(見註釋)

有時候序列化輸出,即使後逃逸,引發字符集查詢螺絲釘的事情了。你可能想要將你的serialize()封裝在base64_encode()調用中,然後在反序列化之前使用base64_decode()。

對於這種情況調整代碼:

$title = base64_encode(serialize($array)); 
$title = unserialize(base64_decode($mysql_data)); 
+0

打我吧;) – 2008-10-09 01:44:35

6

有真的只有兩個合理的選擇,在這裏:

與另一個表加入
優點:無限的冠軍,在無限的語言
缺點:加入的開銷更是計算成本,SQL是稍微更復雜的更新/插入等

多列
例如:TITLE_EN,TITLE_NL,TITLE_DE
優點:快速插入,選擇等
缺點:數量有限的語言,增加更多的是一種ALTER TABLE

鑑於我們兩個選擇,你通常應該應該選擇第一。除非你只處理一些不能並行化的事務,或者你可以確保你永遠不會添加語言,否則架構佈局的額外靈活性可以爲你長期保存頭痛。

2

陣列做違反正常化;在我對國際化數據庫的經驗中,我發現擁有一個標準化的短語是最好的設計,我可以很容易地批量複製行 - 例如'es'到'es-mx'或'en 'en-US','en-GB'和我最喜歡的'xx-piglatin'。在數組模式中,您必須重寫每條記錄或添加複雜的解析,或者使用比數組更復雜的東西,比如XML。

這是比較容易使用LEFT JOIN S代表找到工作未翻譯的短語和也使用COALESCE所以程序仍然可用,即使該短語沒有翻譯返回默認值。

1

使用3列的表!

ID,TITLE_EN,TITLE_NL

沒有很好的理由序列化,真的!