数据库设计:如何支持多
假设我有表格:
TABLE: product
=================================================================
| product_id | name | description |
=================================================================
| 1 | Widget 1 | Really nice widget. Buy it now! |
-----------------------------------------------------------------
如果我想提供多语言支持,那么最好的方法是什么?
可能的解决方案:
我会去解决方案2。
该选项可以最大限度地减少您的第一版的工作量,并减少不改变的列之间的重复。
它确实需要一个额外的JOIN
,但它是一个简单的键连接,所以它不会影响你的性能。
我会选择第三种选择,它是现有设计和解决方案#2的混合体。 表中存在的列现在代表您的“中性”或默认语言。 然后,您将为每个需要翻译值的物件添加一个表,这些值将包含主表的PK,语言代码的关键字和父表中需要翻译的每个值的列。所以我们可能会有
Create Table product_translations
(
product_id int not null References product( id )
, language_code varchar(5) not null
, name ...
, description ...
, Primary Key ( product_id, language_code )
...
)
您的查询将如下所示:
Select P.product_id
, Coalesce( PT.name, P.name ) As Name
From product As P
Left Join product_translations As PT
On PT.product_id = P.product_id
And PT.language_code = 'en-UK'
它的确意味着每个提取产品信息的查询都需要左连接到翻译表,然后在没有翻译值时决定如何处理:返回默认语言术语(如我上面的示例中所示)或返回null。
我会使用(2)的一点修改版本。 我认为不要删除产品表中的name
和description
列 - 在这种情况下,如果本地化版本不存在,您将始终拥有产品的默认值。