保留多语言数据的最佳数据库结构是什么?[重复]

发布于 2021-02-02 16:28:57

这个问题已经在这里有了答案

8年前关闭。

可能重复:
多语言数据库的架构

这是一个例子:

[ products ]
id (INT)
name-en_us (VARCHAR)
name-es_es (VARCHAR)
name-pt_br (VARCHAR)
description-en_us (VARCHAR)
description-es_es (VARCHAR)
description-pt_br (VARCHAR)
price (DECIMAL)

问题: 每种新语言都需要修改表结构。

这是另一个例子:

[ products-en_us ]
id (INT)
name (VARCHAR)
description (VARCHAR)
price (DECIMAL)

[ products-es_es ]
id (INT)
name (VARCHAR)
description (VARCHAR)
price (DECIMAL)

问题是: 每种新语言都需要创建新表,并且每个表中都有“价格”字段重复。

这是另一个例子:

[ languages ]
id (INT)
name (VARCHAR)

[ products ]
id (INT)
price (DECIMAL)

[ translation ]
id (INT, PK)
model (VARCHAR) // product
field (VARCHAR) // name
language_id (INT, FK) 
text (VARCHAR)

问题: 难吗?

关注者
0
被浏览
79
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    您的第三个示例实际上是通常解决问题的方式。努力,但可行。

    从翻译表中删除对产品的引用,然后将翻译的引用放在您需要的地方(反之亦然)。

    [ products ]
    id (INT)
    price (DECIMAL)
    title_translation_id (INT, FK)
    
    [ translation ]
    id (INT, PK)
    neutral_text (VARCHAR)
    -- other properties that may be useful (date, creator etc.)
    
    [ translation_text ]
    translation_id (INT, FK)
    language_id (INT, FK) 
    text (VARCHAR)
    

    作为一种替代方法(不是很好的替代方法),您可以有一个单独的字段,并将那里的所有翻译合并在一起(例如XML)。

    <translation>
      <en>Supplier</en>
      <de>Lieferant</de>
      <fr>Fournisseur</fr>
    </translation>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看