2012-10-04 19 views
0

我在網站上工作,有一個MySQL表稱爲「物品」,如:自動完成在不同的語言或:如何存儲不同語言的Web應用

item_id | item 

(第二列是隻爲識別ITEM_ID)

在language1.php我存儲陣列與ITEM_ID和LANGUAGE1項目本身的名稱,如:根據用戶的語言

$items = array(
1 -> 'Apple', 
2 -> 'Orange', 
... 
); 

,正確的包含語言文件。

應該有一個自動完成輸入框的items-array(< 1000 items/array)。我猜,它不是一個好的解決方案,用php(「search_array」或類似這樣的函數)在language1.php中搜索數組,但我認爲沒有辦法維護這個系統並通過mysql進行搜索,而不是它?

如何爲網站存儲不同的語言並使其可供搜索?

是否有必要將所有語言存儲在mysql中的特定列中?

回答

1

我可能會與列添加一個items_localization表像

item_id, 
locale, 
content, (in your base language of choice) 
translation (the translated content) 

,有一個外鍵item_id,並item_id, locale無論是複合主鍵,或自動增量ID字段和item_id, locale唯一索引。一些人喜歡使用單列自動增量主鍵,因爲他們正在使用的框架,所以如果這描述了你,使用後者的解決方案。

或者,如果你想更廣泛的本地化解決方案,你可以只是有一個localization表列像

localization_id, 
locale, 
content, 
translation 

可以存儲任何類型的國產化。然後,你items_localization表可能僅僅是一個多對多的連接表的列像

item_id, 
localization_id 

你可能只是做一個聯接查詢,讓您正在尋找的本地化。對於使用首先提出的表結構:

SELECT i.*, il.translation 
FROM items AS i 
INNER JOIN items_localization AS il on i.item_id = il.item_id 
WHERE il.locale = ? AND il.translation LIKE "%?%" 

你在哪裏你substitue值當前語言環境,爲?的自動完成搜索短語。

+0

您的'items_localization'確實不應該包含'content'字段。在每一次翻譯中都會有多餘的內容,除了直接查看這些行以外,它不會被使用。 – SJFrK

+0

我個人喜歡有一個地方,我可以看到我的語言選擇的字符串是什麼。我知道這會在時尚方面存在一點冗餘,但對我來說,這並不是真正的性能問題,因爲我永遠無法查詢該字段。你也許可以規範化甚至超過我在第二個模式選項中提到的內容表,然後在轉換表中引用該內容id,但對於我來說,與翻譯的內容並排放置這個字段會更方便在同一張桌子裏。 –

+0

夠公平的,我也沒有正常化一切。但是這對於視圖來說可能是一個很好的用法(如果SQL服務器已經實現了它們)。 – SJFrK