1

我有一个名为的表countries,其结构为:ID、LOCALES_ID、NAME

我想用这个表处理多个语言环境,所以我需要对于不同的 LOCALES_ID,ID 是相同的。所以,如果我插入:

INSERT INTO countries (locales_id, name)
VALUES
('1', 'Lorem'),
('2', 'Ipsum');

我想要在数据库上的最终结果是:

ID | LOCALES_ID | NAME
1  | 1          | Lorem
1  | 2          | Ipsum

但是通过我尝试的 INSERT,我得到了下一个结果:

ID | LOCALES_ID | NAME
1  | 1          | Real insert
2  | 2          | Real insert #2

我的countries表在列 ID 和 LOCALES_ID 上有一个 PRIMAY 索引,我认为这就是我在插入不同的语言环境时需要的全部,我得到了相同的 ID。

我该如何解决这个问题?

先感谢您,

4

2 回答 2

1

您在这里尝试实现的是一对多关系,即每个国家/地区可以有多个区域设置。这无法通过单个表格实现,因为您会发现同一个国家/地区出现多​​次。您应该做的是将数据拆分为两个表。您可以在下面找到一个示例。

国家表的结构
- ID int、自动增量、主键
- 名称 varchar

Locales 表的结构
- CountryID int,主键
- LocaleID int,主键
- Name varchar

处理 INSERT - 要在国家表中插入,只需填充名称字段(或您可能需要的任何其他字段):

INSERT INTO Countries
  (Name)
VALUES
  ('Ireland')

ID 字段将自动填充。对于这个例子,我们可以想象“Ireland”的 ID = 1。
- 要插入 Locales,您将传递三个值,即 CountryID、LocaleID 和 Name。

INSERT INTO Locales
  (CountryID, LocaleID, Name)
VALUES
  (1, 1, 'Lorem')

此查询将为 ID = 1 的国家(即爱尔兰)和“Lorem”插入 LocaleID 作为名称。要插入“Ipsum”,您将执行相同的操作:

INSERT INTO Locales
  (CountryID, LocaleID, Name)
VALUES
  (1, 2, 'Ipsum')

其中 LocaleID 将为 2,对于 ID = 1 且名称为“Ipsum”的国家/地区。

如何检索数据
由于现在数据被拆分为两个表,因此您必须使用 Join 将其放在一起。这很简单:

SELECT
  C.ID AS CountryID
  ,L.Name AS CountryName
  ,L.LocaleID
FROM
  Countries C
  LEFT JOIN
  Locales L ON
    (L.CountryID = C.CountryID) AND
    (L.LocaleID = :InputLocaleID)

就是这样。现在,您的查询将在正确的语言环境中返回带有名称的国家(如果存在)。如果不是,CountryName 和 LocaleID 将为 NULL。

更新 2012/08/11 - 如何使用单表(不推荐)

如果您希望对国家/地区使用单个表,则必须手动处理国家/地区 ID。也就是说,您将按如下方式执行 INSERT:

INSERT INTO Countries
  (ID, LocaleID, Name)
VALUES
  (:CountryID, :LocaleID, :Name)

然而,这会给你留下一个问题。假设该表包含未指定数量的国家,您必须添加一个新的。你会给这个新国家什么ID?

于 2012-08-10T23:26:51.570 回答
0

也许像

Locales
(LocalID, LocaleName) Use the standard id e.g. en-GB
Primary Key (LocaleID)

国家(可能需要为比利时(瓦隆和佛兰芒)等国家/地区开展这项工作

(CountryID,CountryLocaleID)
Primary Key (CountryID)
ForeignKey CountryLocaleID -> Locales(LoacleID)

(添加任何其他国家/地区特定信息,但不添加名称!

CountryTranslations
(CountryID, LocaleID,InternationalisationID) 
Primary Key(CountryID,LocaleID) 
Unique Key(InternationalisatiosnID)
Foreign Key CountryID -> Countries.CountryID
Foreign Key LocaleID -> Locales.LocaleID
Foreign Key InternationalisationID -> Internationalisations.InternationalisationID

(这是您在国家/地区之间的链接及其在各种语言环境中的名称

Internationalisations
(InternationalsationID, Translation)
PK (InternationalisationID)

(你所有的翻译。)

于 2012-08-11T12:26:19.177 回答