SQL 資料庫設計 - 讓產品支援多國語系的四種方式
一、單列方式 (Column Approach)
在單一列,設定多個語系欄位
優點: - 簡單 - 易於實施 - 輕鬆查詢 - 無需JOIN - 沒有重複 - 沒有重複的內容(每個記錄只有一行,只有語言列被重複) 缺點: - 很難維護 - 如果只有2-3種語言會很容易維護,但當您有很多欄或很多語言時,它變得非常龐大且不容易維護 - 很難添加新語言 - 添加新語言時,有設定多國語言的欄位都要進行新增調整(以及db用戶的特殊訪問權限) - 佔用空間 - 如果不是所有的項目都必需翻譯(例如在某些地方,只需使用默認語言),它可能會導致冗餘數據或空的db字段 - 需要建立檢視判斷 - 需要依照目前語系環境決定要撈出哪一列,還需額外判斷才能達成
CREATE TABLE app_product (
`id` int(10) NOT NULL AUTO_INCREMENT,
`date_created` datetime NOT NULL,
`price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
`title_en` varchar(255) NOT NULL,
`title_es` varchar(255) NOT NULL,
`title_fr` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
透過很簡單的Query就能取出資料
<?php
// Retrieve titles for all languages
$sql = "SELECT * FROM `app_product` WHERE 1";
if($result = mysqli_query($link, $sql)){
if($row = mysqli_fetch_assoc($result)){
echo "English: ".$row["title_en"]."<br>";
echo "Spanish: ".$row["title_es"]."<br>";
echo "French: ".$row["title_fr"]."<br>";
}
}
// Retrieve appropriate title according to the chosen language in the system
$sql = "SELECT `title_".$_SESSION['current_language']."` as `title`
FROM `app_product`";
if($result = mysqli_query($link, $sql)){
if($row = mysqli_fetch_assoc($result)){
echo "Current Language: ".$row["title"];
}
}
?>
二、多列方式(Multirow Approach)
方法與第一種很像,但不是透過欄位的方式來建立多國語系,而透過一個語系欄位且不同列的方式來處理 優點: - 簡單 - 易於實施 - 輕鬆查詢 - 無需JOIN 缺點: - 難以維護 - 每個語言的所有列中必須更改未翻譯的每一列。例如,改變單一產品的價格需要對所有語言重複此操作 - 很難添加新語言 - 需要針對每個產品項目進行重複插入操作(從默認的語系作為模板進行複製)
Continue Reading