2011-11-09 11 views
6

このデータベース構造の作成方法を教えてもらえますか?他のテーブルの複数のIDを持つSQLフィールド

Table "countries": 
id, countryname 
1, "US" 
2, "DE" 
3, "FR" 
4, "IT" 

は今、私は別のテーブル「製品」を持っているし、そこに私はこの製品が利用可能な場合、すべての国を保存したいと思います:

Table "products": 
id,productname,countries 
1,"product1",(1,2,4) // available in countries US, DE, IT. 
2,"product2",(2,3,4) // available in countries DE, FR, IT. 

私の質問: はどのようにここで は一例です私は複数の国を格納できるように "製品"のテーブル構造を設計していますか?

私は、コンマ区切りの文字列(つまり「1,2,4」)を入力し、その文字列を分割して各エントリを検索することをお勧めします。しかし、私はこれがこれを行う最善の方法であると疑う。

編集:皆さん、助けてくれてありがとう!正解を選択するのは難しい 私は最終的にGregsを選びました。なぜなら、彼は私にJOINの説明を指摘し、それをどのように使用するのかの例を与えたからです。

答えて

9

を追加する必要があります。

Table Country 
CountryID, CountryName 

Table CountryProduct 
CountryID, ProductID 

Table Product 
ProductID, ProductName 

その後、Inner Join国&製品のリストを取得するには、すべての3つのテーブルが。

Select * From Country 
Inner Join CountryProduct On Country.CountryID = CountryProduct.CountryID 
Inner Join Product On CountryProduct.ProductID = Product.ProductID 
1

country_idフィールドとproduct_idフィールドを持つcountries_productsテーブルを3つ作成することもできます。

2

非正規化がなければ、あなたはそのmany-to-many関係のために交差テーブルを必要とし、余分なテーブル

Table Product countries 
ProductID CountryID 
1   1 
1   2 
1   4... 
2

あなたが話しているのは正規化です。多対多の構造を持っているので、2つをリンクする別のテーブルを作成する必要があります。リレーショナルデータベースに値のリストを格納するために区切られた文字列を使用することは決してありません。

は、ここでは、セットアップの例です:

product_countries table 

productid | countryid 
----------+----------- 
1   | 1 
1   | 2 
1   | 4 
2   | 2 
2   | 3 
2   | 4 

その後、複合主キーにそれらの両方を行い、互いのテーブルに外部キーを使用することができます。リレーショナルデータベースのための最善のアプローチは以下の通りです

SELECT * FROM products, product_countries 
WHERE products.id = product_countries.productid 
AND product_countries.countryid = $cid 
+0

なぜ結合を使用しないのですか?これはいつも私に少し奇妙に見えます – Flo

+0

'JOIN'を使うときのロジックは、OPのはっきりとしたSQL初心者にとってもっと混乱します。確かに、 'JOIN'も動作しますが、ロジックがなければ、より明確で理解しやすくなります。 – Polynomial

+0

お手伝いいただきありがとうございます!はい、SQL-newbieはここにあります。 1つのサブクエリ:そのSQL文は私にとっては遅いようです - 私は100000以上の製品を持っているとしますが、product_countriesを繰り返すのに時間がかかりませんか? – marimba

1

:あなたは、このような国のIDでサポートされている製品のリストを取得することができます

coutriesため

一つのテーブル、の COUNTRY_IDをしましょう、country_desc(country_idはプライマリ)

product_id、product_desc、必要な数の列(product_idはプライマリ)

国が1つしかない場合は、各商品の行にcountry_idを指す外部キーがあれば十分です。外来キーを持つことは、実際の国がcountry tableを参照しているcountry_idであると主張している。あなたのケースでは

はあなたが製品のいくつかの国を持っているので、別の関連テーブル PRODUCT_IDを追加し、プライマリと外国の両方だけでなく

両方のキーをCOUNTRY_ID。

関連する問題