2012-08-10 61 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) 

(您所有的翻譯。)

相關問題