以正确的方式使用PRIMARY KEYS(处理语言环境)

时间:2012-08-10 23:10:33

标签: mysql

我有一个名为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。

我如何解决这个问题?

提前谢谢你,

2 个答案:

答案 0 :(得分:1)

您在此处尝试实现的是一对多关系,即每个国家/地区可以有多个区域设置。使用单个表无法实现这一点,因为您会发现自己多次出现相同的国家/地区。您应该做的是将数据拆分为两个表。你可以在下面找到一个例子。

国家/地区的结构
- ID int,autoincrement,primary key
- 名称varchar

区域设置表的结构
- CountryID int,主键
- LocaleID int,主键
- 名称varchar

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

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

将自动填充ID字段。对于这个例子,我们可以想象“爱尔兰”将具有ID = 1 - 要在区域设置中插入,您将传递三个值,即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)

就是这样。现在,您的查询将返回Country在其正确的Locale中的名称(如果存在)。如果没有,CountryName和LocaleID将为NULL。

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

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

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

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

答案 1 :(得分:0)

也许有点像

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

国家(可能必须为比利时(Waloon和Flemish)等国家开展这项工作

(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)

(所有翻译。)