2012-08-10 67 views
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索引,我认为这是我插入不同语言环境时所需的全部内容。

我该如何解决这个问题?

谢谢你在前进,

+0

你为什么要不同的区域有标识,使有关多大意义为具有相同的客户数量的不同customners。什么时候ID改变,如果它不是一个唯一的标识符,它是什么? – 2012-08-10 23:19:04

+0

@Tony Hopkinson:我想成为ID + LOCALES_ID一个唯一的标识符。我想这是因为用户选择了哪个国家,例如“美国”。如果另一个用户浏览网站的地区fr_FR(法语),我需要向其展示'美国国家统计局'。通过这种方式,我总是保存user.country_id = countries.id,当显示时我可以做'SELECT u.name,c.name FROM users u LEFT JOIN countries c ON u.country_id = c.id AND c.locales_id = “2''。我需要这个网站的多个部分,所以有这个我如何描述它对我非常有用。谢谢! – udexter 2012-08-10 23:26:36

回答

1

什么你想在这里实现是一个一对多的关系,即每个国家可以有多个语言环境。这无法用单个表格实现,因为您会发现多次出现同一个国家/地区。你应该做的是将数据分成两个表格。你可以在下面找到一个例子。

结构Countries表
- ID INT,自动递增,主键
- 名称VARCHAR

结构,语言环境表
- CountryID整型,主键
- 的LocaleID INT,主键
- 名称varchar

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

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。要插入“存有”,你会做相同的:

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

哪里的LocaleID将是2,对国家与ID = 1和名称将是“存有”。

如何检索数据
由于现在数据在两个表拆分,你将不得不使用一个加入把它在一起。这很简单:

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年8月11日 - 如何如果你想使用一个表的国家使用一个表(不推荐)

,你必须手动处理的国家标识。也就是说,您将执行INSERT,如下所示:

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

但是,这会给您带来问题。想象一下,表格中包含的国家数量未指定,您必须添加一个新的国家。你会给这个新国家什么ID?

+0

你能看看我对这个问题的评论吗?我想我不是在做一个奇怪的桌子,我说的只能用一张桌子来实现。是的,我会有一些重复的数据,但我可以完成。我的语言环境表仅仅是'ID,LOCALE,NAME',如:'1,en_US,English(US)'。谢谢! – udexter 2012-08-10 23:30:16

+0

我明白你的要求。你要做的只是使用Locales表,这一定是可以完成的,但这不是维护性的最佳方法。 如果您真的认为这是最好的设计,只需从上面的示例中删除Countries表,然后将您的数据添加到您拥有的单个表中。 你的问题的关键是你不能使用任何自动增量字段,并且当你插入时你必须传递整个密钥。也就是说,你将INSERT(ID,LocaleID,Name)传递所有三个值。 – Diego 2012-08-10 23:38:14

+0

我更新了我的答案,以更好地向您展示如何处理您拥有的单个表格以及它为什么最佳。 – Diego 2012-08-10 23:42:59

0

也许有些东西一样

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

国家(可能需要该位工作像比利时(Waloon和佛兰芒语国家)

(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 

(这是您的国家和它的名称之间的链接vario我们区域设置

Internationalisations 
(InternationalsationID, Translation) 
PK (InternationalisationID) 

(您所有的翻译。)

相关问题