2011-07-19 30 views
2

對於長期的問題,我提前表示歉意。我正在設計一個DNA研究實驗室的網頁,並且我被困在一個特定的點上。該網頁訪問單個MySQL數據庫,但該數據庫包含數十個表。每個表格對應一個實驗。這些表格每個都遵循相同的一般格式:一列列出DNA基因名稱,下一列列出存在的DNA基因的數量。然而,每個表格都包含一組不同的基因(一個實驗中的基因並不總是與另一個實驗相同)。想獲得幫助:如何設計我的網頁來對數據庫中的數據進行排序?

此時,我希望用戶輸入他感興趣的基因,然後網頁將顯示哪些實驗具有該基因的數據。基本上,我需要弄清楚數據庫中的哪些MySQL表具有我想要的數據。

我看到它的方式,我需要遍歷MySQL數據庫中的每個表,並在每個表上執行SELECT WHERE查詢。如果它返回一些東西,它就是我想要的表格,我將把表格名稱添加到數組中。如果不是,我只是轉到下一張桌子。

什麼是最好的方式來做到這一點,我需要什麼語言?我將爲網頁和MySQL使用HTML和PHP進行數據庫查詢。但是,我可以使用什麼來循環表格?我在想JavaScript或ASP?

+0

要做到這一點,最好的方法是將所有數據存儲在一個表中,並帶有實驗的標識符。此外,使用PHP或ASP,但不是我所擔心的,讓它們混合在一起會是維護的噩夢。 – Wrikken

+3

「......包含數十個表格......每個表格都遵循相同的一般格式......」我意識到它可能超出了您的範圍,但這是一個數據庫,需要進行適當的規範化重新設計。 –

+0

感謝您的快速響應!但是,大多數基因都參與了多個實驗。另外,我們正在考慮約28,000個基因。考慮到這一點,你有任何其他建議嗎? – user845454

回答

2

這聽起來像你可能需要重新設計你的數據庫?我認爲你只需要一張桌子,而當前區分桌子的「基因組」應該是該桌子上的非唯一鍵。

然後,你應該能夠查詢該單表所在的基因組等於你正在尋找...

0

既然你打算使用PHP的設置,那麼這是進行邏輯是不錯的選擇你需要的。

您是否擁有對數據庫結構的控制權?如果這樣做,重建數據庫本身可能會更容易,以支持所需的查詢類型。例如,您可以有一個列出實驗的表格,另一個列出基因的表格,以及第三個將實驗連接到基因和其他數據的表格。這將避免所有通過表格搜索你必須做的數據。這樣做的好處是,隨着更多實驗的添加,該應用程序將繼續工作而無需修改PHP代碼。

3

讓我們假設你不能改變你的數據庫結構。您可以使用以下查詢獲取數據庫中所有表的列表:

SHOW TABLES 

接下來,您需要知道哪些表適用於您關心的實驗。你可能需要做一些字符串匹配 - 希望他們的名字以「experiment_」開頭或其他。

然後,您只需運行一個SELECT語句在表中尋找該基因。最後,以某種方式將實驗名稱映射到表名稱,並顯示這些實驗名稱。該代碼會是這樣的:

$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]; 
    } 

} 

在這一切結束時,$ experiment_names有包括有關的基因實驗的列表。

請注意,如果基因名稱是用戶輸入,則需要先對其進行清理以避免SQL注入。

但是,是的,你可能需要一個表,看起來像:

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

你真的應該考慮重新設計人如果提到:

experiment_id 
gene_name 
gene_frequency 

然後,你可以使用一個查詢做這一切儘可能。你的數據格式有一些真正的問題。如果沒有這樣做,你不會有這個問題。數據庫中的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 

這就是關係數據庫是如何工作的。它們通常不是爲了將相同類型的數據保存在兩個不同的表中,僅僅是因爲存在區分屬性。

編輯:

我覺得有必要還指出,你通常還需要一個額外的字段作爲表的唯一鍵使用。我會在表中添加一個名爲「Id」的字段並將其設置爲自動編號。您可以使用由您的數據組成的複合鍵,但通常接受的「最佳實踐」是在數據庫的內部工作環境之外有一個單獨的唯一鍵字段,這是無意義的。該字段將被用作表格的主鍵。