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