【问题标题】:Storing gene expression data in MySQL -- junction tables needed?在 MySQL 中存储基因表达数据——需要连接表吗?
【发布时间】:2016-08-28 13:43:30
【问题描述】:

我有几个 m x n 的基因表达数据矩阵,我想将它们存储在 MySQL 中。

m 是大约 30,000 个基因(唯一可识别的)
n 大约是 3,000 个样本(大部分是唯一可识别的)

我不确定存储这些数据的最佳方式是什么。我最初将矩阵直接读取到 MySQL 表中,但后来我被告知这不是一个很好的方法,因为列(样本)的数量是可变的。我无法转置矩阵并以这种方式存储它们,因为在创建列时,MySQL 允许的基因数量更多。

后来有人告诉我,“联结表”可能是一种更好的方法。然而,在观看了几个关于这些的 YouTube 视频之后,我一点也不聪明。我也搜索了谷歌,似乎没有关于使用连接表在 MySQL 中存储基因表达数据的教程。那么,有人对如何最好地存储这些数据有任何建议吗?老实说,我希望会有大量关于这方面的文献,所以如果您有有用的链接,也将不胜感激。

【问题讨论】:

  • 我猜mysql还没有为这件事做好准备,除非你找到或实现了一些自定义的存储引擎。你看过github吗?像这样的东西,也许 - github.com/phenotips/phenotips 。我也希望你计划实施一些基因极权主义的新世界秩序,这样我们就可以对抗你的恐怖统治
  • 在使用关系数据库时,医疗信息通常存储在 EAV 数据模型中。该模型基本上“交换”行的列。该模型极难用于常规关系操作(连接、搜索等),但它对于存储大量属性(列)数量未知的数据非常有效。谷歌搜索“EAV MySQL”将产生足够的信息。
  • @Mjh 谢谢,但这听起来不太对劲。根据维基百科的文章,这个 EAV 模型最适合稀疏矩阵,但我拥有的矩阵是密集的(实际上,它们没有空值)。此外,我不能将基因作为列,因为 MySQL 的自我限制太多了。
  • @strangeqargo 我认为你可能是对的。不过我会查看这个资源,我实际上并没有考虑查看 github。这是新的世界秩序 v1.0,但如果我无法存储所有数据,它甚至可能不会走那么远。目前一切都在excel中:o
  • 嗯,是的,你不能把基因做成列,但你可以把它们做成行。这就是 EAV 发挥作用的地方,而不是向表中添加列,而是添加分配给实体的行。如果您有一个名为 Gene 001 的实体并且您需要一个额外的“列”,您将在 attributes 表中添加一行,使用 gene_id 引用它并输入其描述 + 值。这样就实现了使用关系数据库添加属性的效果。接受的答案实际上使用了这种模式,通过将基因连接到样本。

标签: mysql join matrix junction-table


【解决方案1】:

你只需要几个表,我使用的是 mysql 语法:

CREATE TABLE genes (
`gene_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`gene_name` varchar(99) not null
)ENGINE=InnoDB;

CREATE TABLE samples (
`sample_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`sample_name` varchar(99) not null
)ENGINE=InnoDB;

CREATE TABLE gene_sample (
`gene_id` INT NOT NULL,
`sample_id` INT NOT NULL,
FOREIGN KEY(`gene_id`) REFERENCES genes (`gene_id`),
FOREIGN KEY(`sample_id`) REFERENCES sample (`sample_id`),
)ENGINE=InnoDB;

对于样本中出现的每个基因,将gene_idsample_id 对插入gene_sample 表中。

在 SELECT 中使用两个 JOIN 表达式来重构完整数据:

SELECT genes.*, samples.* 
FROM gene_sample 
LEFT JOIN genes USING (gene_id) 
LEFT JOIN samples USING (sample_id);

【讨论】:

  • 谢谢,我想我现在明白了!那么gene_sample 表有3 列,但是m x n 行,对应于每个唯一的基因-样本对?巧妙。
  • 您可以使用 2 或 3 列的gene_sample 表,3 列变体具有可用于删除它的 id。您还可以将表中的值作为第 3 列附加。在上面的代码中,我只是假设表中只有 1 和 0,因此不需要值字段。
  • 快速跟进,我注意到连接表达式重新创建了完整的数据,但不是原始的 m x n 形式。可以这样做吗?
  • 是的,使用编程语言,以及一些性能扼杀排序:(ORDER BY sample_id,gene_id)
猜你喜欢
  • 1970-01-01
  • 2016-11-19
  • 2011-01-09
  • 2014-05-24
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多