У меня есть приложение Django, которое обрабатывает рабочие процессы анализа данных, с моделями баз данных, которые выглядят примерно так:
class Workflow(models.Model):
execution_id = models.UUIDField()
class WorkflowItem(models.Model):
workflow = models.ForeignKey(Workflow)
type = models.CharField(choices=["input", "output"])
files = models.ManyToManyField(File)
class File(models.Model):
path = models.CharField()
class FileMetadata(models.Model):
metadata = models.JSONField()
file = models.ForeignKey(File)
version = models.IntegerField()
У данного Workflow
будет много WorkflowItem
, что соответствует File
, которые могут использоваться WorkflowItem
во многих Workflow
. Каждый File
может иметь много связанных FileMetadata
, из которых запись с максимальным значением version
обычно используется для данной операции.
По мере роста приложения становится все труднее создавать все различные комбинации логик c, необходимые для поиска записей в одной таблице на основе заданной записи в другой таблице, просто используя каждую таблицу. Интерфейс внешнего ключа (Workflow
<-> WorkflowItem
<-> File
<-> FileMetadata
).
Я рассматриваю вопрос о создании таблицы, в которой хранятся все внешние ключи для всех отношений в одном месте. Примерно так:
class WorkflowFile(models.Model):
workflow = models.ForeignKey(Workflow)
workflow_item = models.ForeignKey(WorkflowItem)
file = models.ForeignKey(File)
file_metadata = models.ForeignKey(FileMetadata)
Однако я не уверен, хорошая это идея или нет. Мне не ясно, выгодна ли реализация подобной таблицы по сравнению с простым отслеживанием всех связей внешнего ключа для каждой таблицы. Мне также не ясно, как мне настроить такую таблицу с помощью Django, и если новое требование для ручного ввода значений в эту таблицу все время перевесит уменьшенную потребность в уникальных логиках запросов c каждый раз, когда я хочу запросить эти отношения. Моя конечная цель - предоставить более простой и последовательный способ получить все элементы отношения на основе любых других элементов отношения.
Этот вопрос кажется похожим в предпосылка, но мне не ясно, что проблема или предлагаемое решение имеют отношение к тому, что я ищу здесь.