2011-07-19 7 views
2

私は長い質問のために事前にお詫び申し上げます。私はDNA研究室用のウェブページを設計していますが、私はある特定の点についています。 Webページは1つのMySQLデータベースにアクセスしますが、データベースには数多くのテーブルが含まれています。各表は1つの実験に対応しています。各表は同じ一般的な形式に従います.1つの列はDNA遺伝子名を示し、次の列は存在するDNA遺伝子の量を示します。しかし、各表には異なる遺伝子セットが含まれています(ある実験の遺伝子は別の実験の遺伝子と必ずしも同じではありません)。ヘルプ:データベースからデータをソートする私のウェブページをデザインする方法?

この時点で、ユーザーは興味のある遺伝子を入力し、ウェブページにその遺伝子のデータが含まれている実験結果が表示されます。基本的には、データベースのどのMySQLテーブルに必要なデータがあるか把握する必要があります。

私の見方は、MySQLデータベースの各テーブルを順番に調べ、各テーブルでSELECT WHEREクエリを実行する必要があります。それが何かを返す場合、それは私が望むテーブルであり、配列にテーブル名を追加します。そうでなければ、次のテーブルに移動します。

これを行うにはどのような方法があり、どのような言語が必要ですか?私はWebページにはHTMLとPHPを使用し、データベースにはMySQLを使用します。しかし、テーブルを循環させるには何が使えますか?私はJavaScriptまたはASPを考えていた?

+0

これを行う最善の方法は、すべてのデータを1つのテーブルに格納して、実験の識別子を付けることです。また、PHPやASPを使用しますが、両方の広告を使用するのではなく、両方を混在させることはメンテナンスの悪夢となります。 – Wrikken

+3

"...たくさんのテーブルが含まれています...それぞれが同じ一般的なフォーマットに従っています..."私はおそらくあなたの範囲外ですが、これは適切な正規化による再設計のために叫ぶデータベースです。 –

+0

迅速な対応をありがとう!しかし、大部分の遺伝子は複数の実験に関与している。また、我々は約28,000の遺伝子を検討している。それを念頭に置いて、他に提案はありますか? – user845454

答えて

2

データベースを再設計する必要があるようですが、私は、あなたは1つのテーブルが必要だと思うし、現在のテーブルを区別する "遺伝子セット"は、そのテーブル上の一意でないキーでなければなりません。

次に、あなたが遺伝子セットは、あなたが探しているセットに等しくなる単一のテーブルを照会することができるはず...

0

あなたがPHPを使用することを計画しているので、そのロジックを実行するための良い選択ですあなたが必要とするもの。

データベースの構造を制御できますか?そうした場合、必要なクエリの種類をサポートするためにデータベース自体を再構築する方が簡単かもしれません。たとえば、実験をリストした1つのテーブル、遺伝子をリストした別のテーブル、実験を遺伝子とそれに付随する他のデータに関連付ける第3のテーブルを持つことができます。これは、あなたがしなければならないデータのためのすべてのテーブルの検索を避けるでしょう。利点は、より多くの実験が追加されると、PHPコードを変更せずにアプリケーションが動作し続けるということです。

3

データベース構造を変更できないとします。あなたは、クエリを使用して、データベース内のテーブルのすべてのリストを取得することができます。

SHOW TABLES 

次に、あなたが気に実験のためにあるどのテーブルかを知る必要があります。おそらく文字列のマッチングを行う必要があります。名前が "experiment_"か何かで始まったらうまくいけばいいでしょう。

次に、テーブル内のその遺伝子を探すSELECT文を実行します。最後に、実験名をテーブル名にマップして表示します。コードは次のようなものになるだろう:$ experiment_names、このすべての終わりに

$result = mysql_query("show tables"); 

$tables = array(); 

while ($row = mysql_fetch_array($result)) { 
    // Determine whether this is an experiment table. 
    if (preg_match("/^experiment_/", $row[0])) { 
     $tables[] = $row[0]; 
    } 
} 

$tables_with_gene = array(); 

// As you can see, every search runs bunches of queries. 
foreach ($tables as $table_name) { 
    $result = mysql_query("select gene_name from $table where gene_name = '$gene_name'"); 

    if (mysql_num_rows($result)) { 
     $tables_with_gene[] = $table_name; 
    } 
} 

// Now you look up the experiment names 
$experiment_names = array(); 

foreach ($tables_with_gene as $table_name) { 
    $result = mysql_query("select experiment_name from experiments where table_name = '$table_name'"); 
    while ($row = mysql_fetch_array($result)) { 
     $experiment_names[] = $row[0]; 
    } 

} 

問題の遺伝子が含まれる実験のリストを持っています。

遺伝子名がユーザー入力の場合は、まずSQLインジェクションを避けるためにサニタイズする必要があることに注意してください。

しかし、ええ、あなたはおそらくのようになります。1台欲しい:次に使用すると、1つのクエリでそれをすべて行うことができ

experiment_id 
gene_name 
gene_frequency 

を:

SELECT e.experiment_name FROM experiment_data d JOIN experiments e 
ON d.experiment_id = e.id 
WHERE d.gene_name = 'your gene name' 
+0

ありがとう、Rafe。あなたの反応はとても役に立ちました。 – user845454

0

あなたが再設計人々があれば言及したことを本当に考慮すべきですすべて可能です。あなたのデータフォーマットにはいくつかの本当の問題があります。あなたがこのような問題を抱えないように、このようにしなければならない。 28000の記録はデータベースの用語では非常に小さく、遺伝子が複数の実験に関与するかどうかは関係ありません。それは本当にデータベースの複数のフィールドの全体のポイントです。それらは、そのタイプのデータで動作することを意味します。量の列のデータがどの実験を参照しているかを示す別のフィールドが必要です。

がそうではなく....

----------------- 
| Gene | Amount | 
----------------- 
| abc | 123 | 
| xyz | 789 | 
----------------- 

あなたが持っている:

------------------------------ 
| Experiment | Gene | Amount | 
------------------------------ 
|  ex1 | abc | 123 | 
|  ex2 | abc | 456 | 
|  ex2 | xyz | 789 | 
|  ex1 | xyz | 058 | 
------------------------------ 

など、など、など

次に、あなたはそれがだEX1からのデータだけを参照する必要がある場合:

SELECT * 
FROM tblGeneData 
WHERE Experiment = "ex1" 

そのクエリwあなたと同じ結果を与える:

SELECT * 
FROM tblExperiment1 

これは、リレーショナルデータベースがどのように動作するかを示しています。差別化プロパティがあるからといって、同じタイプのデータを2つの異なるテーブルに保持することは一般的には意味がありません。

EDIT:

私もあなたも、追加のフィールドがテーブルの一意のキーとして使用する一般的であろうと指摘する必要性を感じています。私はテーブルに "Id"と呼ばれる追加のフィールドを追加し、それを自動的に作成します。あなたのデータで構成された複合キーを使うことができますが、一般的に受け入れられている "ベストプラクティス"は、データベースの内部動作のコンテキストの外で無意味な別個の一意のキーフィールドを持つことです。このフィールドは、テーブルの主キーとして使用されます。

関連する問題