4

我正在尝试设置一个 django 应用程序,该应用程序允许我存储和查找具有约 500k 独特探针的大量受试者的 dna 微阵列的结果。

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

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 行?

4

1 回答 1

1

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

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

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都有一个 ForeignKey 到ProbeGroup. 接着:

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 更易于管理。但是你可以有更少的组,你必须测试什么最有效。

于 2011-03-04T13:07:33.307 回答