1

countriesID、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

ここで実装しようとしているのは、1 対多の関係です。つまり、各国は複数のロケールを持つことができます。これは、同じ国が複数回表示されるため、単一のテーブルでは実現できません。すべきことは、データを 2 つのテーブルに分割することです。以下に例を示します。

Countries テーブルの構造
- 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 の 3 つの値を渡します。

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

このクエリは、ID = 1 (アイルランド) の国の LocaleID を挿入し、名前として「Lorem」を挿入します。「Ipsum」を挿入するには、同じことを行います。

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

LocaleID は 2 で、ID が 1 で名前が 'Ipsum' の国の場合です。

データの取得方法
データは 2 つのテーブルに分割されているため、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 - 単一テーブルの使用方法 (非推奨)

国に 1 つのテーブルを使用する場合は、国 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 に答える