数据库
首页 > 数据库> > 使用Django和MySQL存储和查找大型DNA微阵列结果

使用Django和MySQL存储和查找大型DNA微阵列结果

作者:互联网

我正在尝试设置一个django应用程序,它允许我存储和查找dna微阵列的结果,其中包含~50万个独特探针,适用于大量受试者.

我一直在玩的模型设置如下:

class Subject(models.Model):
    name = models.CharField()

class Chip(models.Model):
    chip_name = models.Charfield()

class Probe(models.Model):
    chips = models.ManyToManyField(Chip, related_name="probes" )
    rs_name = models.CharField(unique=True)
    chromosome = models.IntegerField()
    location = models.IntegerField()

class Genotype(models.Model):
    probe = models.ForeignKey(Probe, related_name='genotypes')
    subject = models.ForeignKey(Subject, related_name='genotypes')
    genotype = models.CharField()

我想知道是否有更好的方法来设置它?我只是想,对于每个主题,我将在Genotype表中创建500k行.

如果我使用MySQL数据库,它是否能够处理大量的主题,每个主题添加500k行到该表?

解决方法:

好吧,如果每个探针需要每个探针的结果(基因型),那么标准的多对多中间表(基因型)确实会变得非常大.
拥有1000个主题,您将拥有5亿条记录.

如果您可以在一列或多列中保存基因型字段编码/序列化的值,那将大大减少记录量.保存在单个列中编码的500k结果将是一个问题,但如果您可以将它们分组,则应该可行.这会将记录数量减少到nr.主题或者另一种可能是Probe-s在ProbeGroup-s中分组并具有nr. ProbeResults = nr.主题* nr. ProbeGroup.
第一个选项是:

class SubjectProbeResults(models.Model):
    subject = models.ForeignKey(Subject, related_name='probe_results')
    pg_a_genotypes = models.TextField()
    ..
    pg_n_genotypes = models.TextField()

这当然会使搜索/过滤结果变得更加困难,但如果保存的格式很简单,则不应该太难.
您可以在基因型列中使用以下格式:“probe1_id | genotype1,probe2_id | genotype2,probe3_id | genotype3,…”

检索特定基因型探针的主题查询集.

一个.确定探针属于哪个组
  即“C组” – > pg_c_genotypes

湾查询probe_id基因型组合的相应列.

from django.db.models import Q

qstring = "%s|%s" % (probe_id, genotype)

subjects = Subject.objects.filter(Q(probe_results__pg_c_genotypes__contains=',%s,' % qstring) | \
                               Q(probe_results__pg_c_genotypes__startswith='%s,' % qstring) | \
                               Q(probe_results__pg_c_genotypes__endswith=',%s' % qstring))

我提到的另一个选项是也有ProbeGroup模型,每个Probe都有一个到ProbeGroup的ForeignKey.然后:

class SubjectProbeResults(models.Model):
    subject = models.ForeignKey(Subject, related_name='probe_results')
    probe_group = models.ForeignKey(ProbeGroup, related_name='probe_results')
    genotypes = models.TextField()

您可以查询相同的基因型字段,但现在您可以直接查询该组,而不是确定您需要搜索的列.
这样,如果你有前任.每组1000个探针 – > 500组.然后对于1000名受试者,你将拥有500K的SubjectProbeResults,仍然很多,但肯定比500M更易于管理.但是你可以拥有更少的团队,你必须测试最有效的团队.

标签:python,django,django-models,large-data
来源: https://codeday.me/bug/20190710/1420429.html