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

Posted

技术标签:

【中文标题】需要帮助:如何设计对数据库中的数据进行排序的网页?【英文标题】:Want help: how to design my webpage that sorts data from a database? 【发布时间】:2011-10-08 20:04:24 【问题描述】:

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

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

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

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

【问题讨论】:

最好的方法是将所有数据存储在 1 个表中,并带有实验的标识符。此外,使用 PHP 或 ASP,但就我而言,不能同时使用两者,将它们混合在一起将是维护的噩梦。 "...包含几十个表...每个都遵循相同的通用格式..." 我意识到这可能超出了您的范围,但这是一个需要通过适当的规范化重新设计。 感谢您的快速回复!但是,大多数基因都涉及多个实验。此外,我们正在考虑大约 28,000 个基因。考虑到这一点,您还有其他建议吗? 【参考方案1】:

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

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

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

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'

【讨论】:

非常感谢 Rafe。您的回复很有帮助。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

既然您打算使用 PHP,那么这是执行您需要的逻辑的好选择。

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

【讨论】:

【参考方案4】:

如果可能的话,您真的应该考虑到人们提到的重新设计。您的数据格式存在一些实际问题。如果不这样做,你就不会有这个问题。 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”的附加字段并使其自动编号。您可以使用由数据组成的复合键,但普遍接受的“最佳实践”是拥有一个单独的唯一键字段,该字段在数据库内部工作环境之外毫无意义。该字段将用作表的主键。

【讨论】:

以上是关于需要帮助:如何设计对数据库中的数据进行排序的网页?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 如何实现对中文进行排序?

网页端表格设计指南

如何将 csv 文件中的数据排序为标准化输出,同时读取标题以对数据进行排序

我需要帮助以这种特殊方式根据频率对 java 中的数组进行排序

如何使用 apollo 服务器对 graphQl 中的数据进行排序?

Mysql数据查询in的时候如何排序