すべての被験者のプローブごとの結果(遺伝子型)が必要な場合は、標準の多対多の中間テーブル(遺伝子型)が実際に巨大になります。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よりも確実に管理しやすくなります。ただし、グループを少なくすることもできます。何が最も効果的かをテストする必要があります。