使用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