2009-03-10 14 views
0

[OK]を、私は検索し、オンラインのソリューションを検索し、任意のリードを見つけることができません、ここでは(ああ、私はこのデータベース品物;-)初心者のMySQLデータベースモデリングの問題

私は何千もの小売店を持ち、それぞれが1から100の製品を運ぶことができますが、入手可能な製品は10,000種類あります。私は各店舗のオーナーが店内の商品のリストを見ることができるようにする必要があります - これは簡単で、これのテーブル構造を理解することができます - でも私がしたいことは、最も一般的な製品の組み合わせ店舗全体で、例えば私のようなものを見たいので:最初の数はそれらの製品と店舗数(店舗内の製品の順序は重要ではありません)です

 
120: pid34, pid234, pid876, pid120, pid100 
118: pid45, pid54, pid657, pid763, pid237 
115: pid23, pid546, pid657, pid543, pid23 

を、 pid番号は製品の製品IDです(ただし、各店舗には最大100個の製品があることを覚えておいてください)。

は、もしそうなら、私はテーブルの設定:私は私の店の在庫を追跡することができ

 
ID, PID, Store ID 
1, pid34, 10 
2, pid234, 10 
3, pid876, 10 
4, pid120, 10 
5, pid100, 10 
6, pid45, 45 
... etc ... 

を、しかし、私は、私は、私の「組み合わせ」の検索を行うことができますかさっぱりだが!

+0

@リチャード、それはあなたが何をしたいのかにかかっていますか?シンプルな設計が必要な場合は、データベーステーブルを十分に設計する必要があります。正規化を参照してください。もっと助けが必要な場合は、ここに戻ってきてください。 – melaos

答えて

0

これは、データベースの問題ではありません。これは、PrologやECLiPSeのようなものが、他の言語の制約ソルバーにはぴったりの問題です。

0
 
var1 = Select the unique store numbers 

foreach var1 
    select the products that apply to that store number. 
/foreach 

正義は正しいですが、これは必ずしもデータベースの問題ではなく、むしろより一般的なプログラミングの問題です。

1

データベースクエリを使用してこの問題のほとんどを解決できるはずですが、このクエリをラップする別のプログラミング言語(JDBCと一緒にJavaなど)が必要です。何らかの種類のSQLデータベースを使用していると仮定します。あなたの構造を見て、私はあなたがgroup by節を使う必要があると考えています。私はあなたのデータベースの構造を知っていませんが、あなたはそれが私があなたのテーブルは、それぞれの数を取得するには、「製品」

てみましょう最初のデザインクエリと呼ばれていると言うこれのために行きます言及しなかったので、製品:

SELECT pid, COUNT(*) AS NUM FROM products p GROUP BY pid ORDER BY NUM DESC; 

次のようにこのクエリが何かを返します。

pid, NUM 
pid34 120 
pid29 120 
pid20 20 

をだから、これは近いが、まだ指名手配されていない、まさになってきています。しかし、今ではプログラミング言語と組み合わされたクエリを使用することで、簡単に行うことができます。私は例として以下のいくつかのJavaコードを実行しました。

// Assumes that database connection has already been made and is in the variable: conn1 
Statement stmt1 = conn1.createStatement(); 
ResultSet rs1 = stmt1.executeQuery("SELECT pid, COUNT(*) AS NUM FROM products p GROUP BY pid ORDER BY NUM DESC"); 

int prevNum = -1; 
while(rs1.next()) 
{ 
    int thisNum = rs1.getInt("NUM"); 
    if(thisNum != prevNum) 
    { 
     // this means it is a different number than the last result, start a new line 
     system.out.print("\n" + thisNum + ": "); 
     prevNum = thisNum; 
    } 
    system.out.print(rs1.getString("pid") + ", "); 
} 
stmt1.close(); 
conn1.close(); 

私はそれをフォーマットするために来る場合は特に、すべてのロジックが正しくない可能性がありますが、これはあなたがそれについて移動する必要がどのようにして正しい道に軌道に乗る必要があります。本当にこの問題は、クエリとプログラミング言語を組み合わせて解決する必要があります。

クエリは小さな問題のサブセットを実行できますが、これらの問題は非常にうまく処理されますが、プログラミング言語はさまざまな問題を解決できます。しかし、多くの場合、プログラミング言語はデータベースが同じ問題を解決するのと同じくらい効率的ではありません。なぜなら、2つの何度も組み合わせることで、複雑な問題を多くの効率で解決できるからです。