数据库设计:如何支持多

假设我有表格:

TABLE: product
=================================================================
| product_id | name           | description                     |
=================================================================
| 1          | Widget 1       | Really nice widget. Buy it now! |
-----------------------------------------------------------------

如果我想提供多语言支持,那么最好的方法是什么?

可能的解决方案:

  • 在上表中添加一个“语言”栏; 这将表明特定记录的语言。 (我不认为这是我的选择,因为其他表将使用product.product_id作为其FK。)
  • 删除产品表中的所有可翻译列(在上面的示例中,product.name和product.description),并将其放在带有“语言”列的单独表格中。 该新表将使用product.product_id作为FK。 (在我的应用程序的第一个版本中,我不会支持多种语言,这种解决方案意味着我必须额外加入JOIN才能获得最初支持的语言的值。)
  • 我还没有考虑过的其他东西?

  • 我会去解决方案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)的一点修改版本。 我认为不要删除产品表中的namedescription列 - 在这种情况下,如果本地化版本不存在,您将始终拥有产品的默认值。

    链接地址: http://www.djcxy.com/p/37495.html

    上一篇: Database Design: how to support multi

    下一篇: How should I write this Entity Framework query?