Проблема с выбором схемы базы данных SQL в Django

Я создаю базу данных, в которой содержится множество молекул и множество различных атрибутов (например, уровни энергии ионизации). Каждый атрибут может иметь одно или несколько значений, и я не уверен, как лучше всего это представить. Я новичок в реляционных базах данных, поэтому у меня возникли проблемы с поиском наилучшего способа их хранения, совместимого с ACID. Я также новичок в Django, хотя я ознакомился с руководством и некоторой документацией.

Я также должен упомянуть, что в настоящее время я использую sqlite в качестве своей СУБД, поскольку веб-сайт будет доступен только для чтения.

Моя текущая концепция состоит в том, чтобы иметь две модели. Одна из них предназначена для описания молекулы, сейчас это только ее название, но в конечном итоге оно может включать и другие описания. Вторая модель была бы для атрибутов, фактически это просто название атрибута, название молекулы и единственное значение, которое содержит атрибут. Они имеют отношение "один ко многим" от названия молекулы до значений атрибута.

Но это означает, что название атрибута и название молекулы будут часто повторяться. Это нормально? Есть ли способ лучше?

В конце концов, я бы хотел, чтобы пользователи могли фильтровать данные по своим спецификациям и загружать их в формате csv. Например, если кому-то нужны были все молекулы с уровнем ионизации более 10, они могли просто ввести это в поисковую строку и загрузить данные. Из-за этого я решил не сохранять значения атрибута в виде строки в формате csv.

Кроме того, я не могу просто создать новую таблицу для каждой молекулы, потому что это означало бы создание множества классов в цикле, и я чувствую, что это приведет к путанице, поскольку молекулы и атрибуты добавляются в дальнейшем.

Первое правило: делайте все просто

from django.db import models

class Molecule(models.Model):
    name = models.CharField(max_length=200, unique=True)
    # Add more 

class Attribute(models.Model):
    name = models.CharField(max_length=200, unique=True)
    unit = models.CharField(max_length=50, blank=True, null=True) 

class AttributeValue(models.Model):
    molecule = models.ForeignKey(Molecule, on_delete=models.CASCADE, related_name="attributes")
    attribute = models.ForeignKey(Attribute, on_delete=models.CASCADE, related_name="values")
    value = models.FloatField()  # or CharField if sometimes not numeric
Вернуться на верх