2010-08-26 113 views
2

要存儲多語言內容,是否有大量內容存儲在數據庫或文件中?那麼解決這個問題的基本方法是什麼?我們有頁面內容,參考表,頁面標題欄,元數據等等。那麼每個表每個語言都會有額外的列嗎?因此,如果有50種語言(由於這是一個遍佈全球的社交網站,因此數量會不斷增長,因此最終的目標是儘可能多的語言),那麼每個表格需要增加50個列。或者,還有更好的方法?多語言社交網站 - 數據庫驅動?

有動態系統和用戶內容+靜態內容的混合。

可伸縮性和性能很重要。在PHP和MySQL中開發。

用戶將能夠在頁腳的任何頁面上更改語言。語言可以是基於會話或基於偏好的。不知道什麼是更好的路線?

回答

0

絕對從一個明確的模型開始,所以你的設計不關心數據是來自文件,數據庫還是甚至是memCache或類似的東西。可能最好每頁只進行一次調用,以獲取包含該單個頁面的所有字段的對象,而不是多次調用。您可以引用該單個返回的對象來獲取每個本地化字段。在幕後,你可以編寫代碼庫訪問和測試。就我個人而言,我可能會通過文件使用數據庫方式 - 您不必擔心併發文件訪問問題,並且可能更容易部署更改 - 再次,您無需擔心文件被讀取鎖定部署新文件 - 只是一個數據庫更新。

看到這個鏈接關於php ioc,這可能會幫助你,因爲這將允許你從你的代碼抽象什麼類型的respository被用來保存數據。這樣,如果你採用一種方法,後來你想改變它 - 你不必做太多的返工。

3

如果你有一個變量,今天基本上不爲人知的語言數量,比這絕對不應該是一個記錄中的多個列。基本上這個表上的搜索鍵應該是類似於消息ID和語言ID,或者可以是屏幕ID加上消息ID和語言ID。然後,每條消息的每種語言都有單獨的記錄。

如果您嘗試將所有語言塞入一個記錄,您的維護將成爲一場噩夢。每次你添加另一種語言的應用程序,你將不得不通過每個程序添加「其他如果語言==」他加祿'然後text = column62「或其他。使它成爲搜索關鍵字的一部分,然後你只是閱讀「where messageId ='Foobar'和language = current_language」,然後你傳遞當前的語言。如果你有一種新的語言,除了將某種新語言添加到某些地方的有效語言代碼列表中外,沒有什麼需要改變。

2

所以,真正的問題是:

等等等等等等。我應該將數據保存在平面文件還是數據庫中?

簡答題是您發現更容易處理的任何一個。根據您的結構,基於文件的方法可能比數據庫方法更快。 OTOH,弄錯了,性能影響將是巨大的。數據庫方法從一開始就執行更一致的結構。所以,如果你隨時隨地補上,那麼從長遠來看,數據庫方法很可能會得到回報。

最終的目標是儘可能多的語言),那麼每桌50個額外的列?

如果您需要更改數據庫模式(或文件結構),每次添加一種新的語言(或新內容)號那麼你的模式是錯誤的。如果你不明白如何正確建模數據,那麼我會強烈建議數據庫的方法出於原因。

你也應該學會如何規範你的數據 - 即使你最終選擇使用非關係數據庫將數據保持在

0

沒有理由需要用一個數據源堅持爲人人「內容」。有些動態內容會定期添加或更新,然後會有相對靜態的內容,這些內容很少會被修改。然後是外圍內容,如系統消息和菜單文本,與主要內容—用戶實際在這裏看到的內容。您很少需要搜索或索引外圍設備內容,而您可能希望能夠在主要內容上運行查詢。

在大多數情況下,動態內容和主要內容應放置在數據庫中。靜態外設內容可以放置在數據庫中或不放置。如果網站由專業的網絡開發人員維護,那麼將其直接編入.pot或文件可能會更方便,如果直接使用命令行工具,則無法將其放入數據庫。

搜索標籤i18n和l10n以獲取更多關於實施國際化/本地化的信息。至於如何設計一個數據庫模式,這是一個值得自己考慮的問題。我將按照symcbean的建議搜索正常化問題,並查找一些關於數據庫設計的教程。