如何設計多語言數據庫
譯文?作者 | Antonello Zanini
譯者 | 李睿
策劃 | 武穆
讓數以百萬計的用戶使用自己開發的應用程序是每個開發人員的夢想。如果讓世界各地的用戶都能使用其開發的應用程序,那么實現這一目標將變得更加容易。由于并非所有用戶都精通英語或開發人員的母語,因此需要將其設計為多語言的應用程序。但是如果沒有多語言數據庫,這是不可能實現的。
設計一個可以輕松擴展到新語言的多語言數據庫并不容易。這就是開發人員應該依賴最佳實踐的原因。以下將介紹為什么需要多語言數據庫、三種出色的多語言數據庫設計,以及如何選擇最適合的多語言數據庫。
下面開始介紹有關多語言數據庫設計的知識。
1.為什么需要多語言數據庫?
開發人員可能永遠不知道他的應用程序將會增長多少,也許他為朋友開發的一個小應用程序有可能成為數百萬人使用的國際服務。如果希望開發的產品能夠在國際上得以推廣,則需要對其進行多語言設計,以便可以輕松地使其適應不同的文化和市場。這就是國際化的意義所在。
建立一個為國際化做好準備的數據庫意味著設計一個可以存儲多語言數據的數據庫。換句話說,后端應該能夠提供多種語言的數據。為此,后端應連接并從多語言數據庫中檢索這些數據。
需要注意的是,讓用戶可以在多種語言之間切換是一個很好的功能。這對于多語種或非母語人士特別有用。因此,即使開發的項目很小并且針對本地市場,開發人員也應該考慮使用多語言數據庫。畢竟,開發人員無法提前知道其項目將取得多大成功以及哪些用戶將使用它。以下介紹為什么開發人員選擇正確的多語言數據庫設計是至關重要的。
2.為什么應該精心設計多語言數據庫
就時間和精力而言,更改數據庫是一項非常昂貴的操作,因為它會引發連鎖反應。修改數據庫的結構涉及更改連接到它的后端。這可能還需要開發人員相應地調整依賴這些后端的前端。總之,更改數據庫結構不是沒有后果的操作。因此,開發人員應該設計一個可以輕松擴展且無需頻繁更改的數據庫。
可以想象,設計多語言數據庫有多種方法,每種解決方案都有其優缺點??紤]到數據庫結構對應用程序的重要性,開發人員必須精心設計多語言數據庫。這就是開發人員不應該從頭開始而是依賴最佳實踐的原因。
以下介紹一些基于最佳實踐的多語言設計。
3.多語言數據庫的三個設計
作為一名為世界各地的初創公司工作的全棧web開發人員,讓我們更深入地探討三種多語言設計的優缺點。
(1)列方法
在這種方法中,多語言表中的每個字段的列數等于數據庫支持的語言數。
具體來說,這是列名模板的樣子:columnName_languageCode
優點:
- 簡單:易于實施。
- 快速:不涉及JOIN或慢查詢。
- 易于處理未翻譯的字段:如果缺少某個字段的翻譯,可以直接使用。例如,COALESCE(name_it, name_en)→如果name_it不為NULL,則返回name_it,否則返回name_en默認值。
缺點:
- 難以維護:添加新語言需要更新數據庫中所有的多語言表。這也意味著開發人員需要相應地更改其ORM映射。
- 不可擴展:表中的列數隨著應用程序支持的語言數量而增長。
- 復雜的SELECT條件:忘記SELECT*。需要在SELECT子句中指定每一列。
(2)行方法
在這種方法中,每種語言都有一行。識別多語言實體的關鍵是以下復合主鍵: <id, languageCode>
優點:
- 簡單:易于實施。
- 快速:檢索翻譯的內容只需要languageCode上的WHERE條件。
缺點:
- 復合主鍵更加復雜:使用復合主鍵使識別元素和JOIN查詢更加復雜。
- 重復內容:為簡化起見,非翻譯列通常存儲保存在默認語言行列中的相同內容。這意味著開發人員將在多語言表格中擁有大量重復的內容。
(3)翻譯表法
在這種方法中,多語言表的每一列都是翻譯表的外部鍵。換句話說,每個涉及多語言字段的表都有一個翻譯表。
優點:
- 可擴展性:添加新語言不涉及更改數據庫結構。
- 支持歷史數據:可以使用翻譯表來跟蹤實體中每個字段的翻譯歷史。
- 集中式:一個實體的所有翻譯都存儲在一個地方。
缺點:
- 查詢復雜:查詢變得更加復雜,因為與多語言實體相關的信息分布在兩個表中。
- 慢查詢:檢索與實體關聯的所有信息需要與列數一樣多的JOIN。考慮到JOIN對性能的負擔,這很容易成為問題。
- 重復表:它增加了數據庫表的大小。另外,需要兩個表來定義每個多語言實體。
4.什么是最適合的多語言數據庫設計?
每種多語言數據庫設計都有一定優點和缺點。這意味著沒有萬能的方法。開發人員必須根據自己的要求、需要和目標仔細選擇。我個人在不同的項目中使用了這三種方法,并從中吸取了經驗教訓。
當處理大數據時,開發人員可能在連接查詢或重復內容時不堪重負,尤其是從擁有包含數百萬行的表的數據庫的角度來看,列方法特別有用。雖然列方法并不是最具可擴展性的解決方案,但它是唯一可行的大數據設計。
另一方面,當企業能夠得到在當地市場運營的分支機構的支持時,行方法很有用。在這種情況下,內容的重復甚至可能是一個優勢。
最后,如果開發人員正在尋找一個優雅且可擴展的解決方案,并且不介意性能缺陷,那么翻譯表法是正確的設計,因為翻譯表法更適合數據不會暴漲的項目。
5.結論
設計一個可以存儲多語言數據的數據庫,對于幫助開發人員在國際上擴展業務至關重要。此外,多語言數據的數據庫還允許非母語人士使用其應用程序。更改數據庫是一項復雜且耗時的操作,對應用程序架構的影響不可忽視。這就是開發人員應該從一開始就將數據庫設計為多語言的原因。
文章中分析了設計多語言數據庫的三種不同方法,研究了它們的優缺點,并詳細介紹了最適合的方法。
原文鏈接:https://dzone.com/articles/designing-a-multi-language-database?