Использование Django с MySQL для хранения и поиска больших результатов ДНК-микрочипов - PullRequest
4 голосов
/ 04 марта 2011

Я пытаюсь настроить приложение django, которое позволяет мне сохранять и искать результаты микроматрицы днк с ~ 500k уникальными зондами для большого количества объектов.

Настроена модель, которую я имеюиграл в следующем:

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()

Мне было интересно, есть ли лучший способ настроить это?Я просто думал, что для каждого предмета я буду создавать 500 тыс. Строк в таблице Genotype.

Если я использую базу данных MySQL, сможет ли она обрабатывать большое количество объектов, каждый из которых добавляет 500 тыс. Строк в эту таблицу?

1 Ответ

1 голос
/ 04 марта 2011

Что ж, если вам нужен результат (генотип) для каждого зонда для каждого предмета, тогда стандартная промежуточная таблица «многие ко многим» (генотип) действительно станет огромной. С 1000 субъектов у вас будет 500 миллионов записей.

Если бы вы могли сохранить значения для поля genotype, закодированного / сериализованного в один или несколько столбцов, это значительно сократило бы количество записей. Сохранение 500 тыс. Результатов, закодированных в одном столбце, было бы проблемой, но если вы можете разделить их на группы, это должно быть работоспособным. Это уменьшит количество записей до nr. предметов. Или другой возможностью может быть сгруппировать Probe-s в ProbeGroup-s и иметь nr. ProbeResults = номер Тема * номер 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 + genotype.

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. Но у вас может быть меньше групп, вам нужно проверить, что работает лучше всего.

...