繁体   English   中英

需要帮助:如何设计对数据库中的数据进行排序的网页?

[英]Want help: how to design my webpage that sorts data from a database?

我提前为这个冗长的问题道歉。 我正在为 DNA 研究实验室设计一个网页,但我被困在一个特定的点上。 该网页访问单个MySQL数据库,但该数据库包含几十个表。 每个表对应一个实验。 每个表格都遵循相同的一般格式:一列列出 DNA 基因名称,下一列显示存在的 DNA 基因的数量。 但是,每个表都包含一组不同的基因(一个实验中的基因并不总是与另一个实验中的相同)。

此时,我希望用户输入他感兴趣的基因,然后网页会显示哪些实验有该基因的数据。 基本上,我需要弄清楚数据库中的哪些 MySQL 表有我想要的数据。

在我看来,我需要循环浏览 MySQL 数据库中的每个表,并对每个表执行 SELECT WHERE 查询。 如果它返回一些东西,那就是我想要的表,我会将表名添加到数组中。 如果没有,我就转到下一张桌子。

最好的方法是什么?我需要什么语言? 我将使用 HTML 和 PHP 用于网页和 MySQL 用于数据库查询。 但是,我可以用什么来循环浏览表格? 我在想 javascript 还是 ASP?

假设您无法更改数据库结构。 您可以使用以下查询获取数据库中所有表的列表:

SHOW TABLES

接下来,您需要知道哪些表用于您关心的实验。 您可能需要进行某种字符串匹配——希望它们的名称以“experiment_”或其他名称开头。

然后您只需运行 SELECT 语句在表中查找该基因。 最后,您以某种方式将实验名称 map 转换为表名称,并显示这些实验名称。 代码将类似于:

$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 注入。

但是,是的,您可能想要一张如下所示的表格:

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'

听起来您可能需要重新设计数据库? 我认为您只需要一张表,而当前区分表的“基因集”应该是该表上的非唯一键。

然后,您应该能够查询该基因集等于您要查找的集的单个表...

由于您计划使用 PHP,因此这是执行所需逻辑的不错选择。

你能控制数据库的结构吗? 如果您这样做,可能更容易重组数据库本身以支持您需要的查询类型。 例如,您可以有一个表列出实验,另一个表列出基因,第三个表将实验与基因和与之相关的其他数据连接起来。 这将避免在表格中搜索您必须执行的所有数据。 这样的好处是,随着更多实验的添加,应用程序将继续工作,而无需修改 PHP 代码。

如果可能的话,您应该真正考虑到人们提到的重新设计。 您的数据格式存在一些实际问题。 如果不这样做,你就不会有这个问题。 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"

该查询将为您提供与以下相同的结果:

SELECT *
FROM tblExperiment1

这就是关系数据库的工作方式。 它们通常并不意味着将相同类型的数据保留在两个不同的表中,因为它们具有区分属性。

编辑:

我觉得还需要指出,您通常还需要一个附加字段用作表的唯一键。 我会在表中添加一个名为“Id”的附加字段并使其自动编号。 您可以使用由数据组成的复合键,但普遍接受的“最佳实践”是拥有一个单独的唯一键字段,该字段在数据库内部工作环境之外毫无意义。 该字段将用作表的主键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM