4

私は、多数の被験者に対して最大500kの固有のプローブを備えたdnaマイクロアレイの結果を保存および検索できるdjangoアプリをセットアップしようとしています。

私がいじっていたモデルのセットアップは次のとおりです。

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エンコード/シリアル化されたフィールドの値を1つ以上の列に保存できれば、レコードの量が大幅に削減されます。単一の列にエンコードされた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、...」という形式を設定できます。

特定の遺伝子型+プローブのサブジェクトのクエリセットを取得します。

a。プローブが属するグループ、つまり「グループC」->pg_c_genotypesを特定します

b。それぞれの列で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ます。その後:

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 に答える