10

如果以下问题可能有更好/不同/常见的解决方案,我正在寻找意见:


我有一个产品数据库,其中包含英文(此应用程序的默认语言)产品名称,如果可用,我需要名称的翻译。

目前我有这个设置:

产品表

CREATE TABLE products
(
  id serial NOT NULL,
  "name" character varying(255) NOT NULL,
  CONSTRAINT products_pkey PRIMARY KEY (id)
)

和产品本地化表

CREATE TABLE products_l10n
(
  product_id serial NOT NULL,
  "language" character(2) NOT NULL,
  "name" character varying(255) NOT NULL,
  CONSTRAINT products_l10n_pkey PRIMARY KEY (product_id, language),
  CONSTRAINT products_l10n_product_id_fkey FOREIGN KEY (product_id)
      REFERENCES products (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)

我使用以下查询检索本地化产品列表(在本例中为德语),并回退到默认英文名称:

SELECT p.id, COALESCE(pl.name, p.name) 
from products p LEFT 
JOIN products_l10n pl ON p.id = pl.product_id AND language = 'de';

SQL 代码是 postgres 方言。数据存储为 UTF-8。

4

6 回答 6

7

对我来说看上去很好。我可能会改变的一件事是您处理语言的方式:这可能应该是一个单独的表格。因此,您将拥有:

CREATE TABLE products_l10n
(
  product_id serial NOT NULL,
  language_id int NOT NULL,
  "name" character varying(255) NOT NULL,
  CONSTRAINT products_l10n_pkey PRIMARY KEY (product_id, language),
  CONSTRAINT products_l10n_product_id_fkey FOREIGN KEY (product_id)
      REFERENCES products (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
  CONSTRAINT products_l10n_language_id_fkey FOREIGN KEY (language_id)
      REFERENCES languages (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)

CREATE TABLE languages
)
  id serial not null
  "language" character(2) NOT NULL
)

除此之外,我认为您已经找到了最好的解决方案。

于 2008-10-10T00:28:51.497 回答
1

看起来不错 - 类似于我首选的本地化技术 - 宽字符(日语)呢?我们总是使用 nvarchar 来处理它。

然而,在我们的国际采购业务中,我们实际上发现,产品的国际边界并没有一致性,因为每个国家的供应商不同,所以我们将界面国际化/本地化,但数据库完全不同。

于 2008-10-10T00:34:38.427 回答
1

我可以提供的唯一变化是您可能还想包括国家/方言的可能性;例如,不要只使用英语 (en),而是使用英语 US (en-US)。这样你就可以解释所有的变化(例如,英国的拼写,法裔加拿大人可能与在法国说的法语有差异,等等)。

于 2008-10-10T00:57:49.707 回答
0

在我看来很体面。

显然,您应该将本地化名称放入 Unicode 列,您可以选择将英语默认值放入 ASCII 字段(假设数据库支持)。最好只做 Unicode 并“忘记”它。

于 2008-10-10T00:33:55.387 回答
0

其他人没有提到的唯一复杂因素是代码集——你能处理希伯来语、阿拉伯语、俄语、汉语、日语吗?如果一切都是Unicode,你只需要担心GB18030(中文),它是(IIUC)Unicode的超集。

于 2008-10-10T21:40:46.470 回答
0

在处理这类事情时,我使用构建一个根本不包含名称的产品表,以及一个只包含名称的 product_translation 表(显然还有更多)。

然后我结束了这种查询:

选择
    i.id,
    i.价格,
    它.标签
从
    我的项目
    LEFT JOIN items_trans 它
        ON i.id=it.item_id AND it.lang_id=(
            选择 lang_id
            FROM items_trans
            WHERE item_id=i.id
            订购方式
                (lang_id=1) DESC,
                (lang_id=0) DESC
            限制 1
        )

你怎么看 ?

于 2010-02-04T07:55:16.570 回答