Джанго: Нужна помощь со схемой БД (ManyToMany, ForeignKey отношения) - PullRequest
2 голосов
/ 30 июня 2011

Я новичок как в Django, так и в MySQL, поэтому я прошу прощения, если это окажется простым вопросом.

Я работаю над сайтом управления проектами.Скажем, у нас есть Program.Каждая программа имеет определенное число Milestones, которое, в свою очередь, имеет определенное количество Tasks, которое необходимо заполнить, чтобы достичь этапа.Вехи будут одинаковыми в разных программах, но нет никакой гарантии, что задачи, необходимые для каждого этапа, останутся одинаковыми в разных программах.

Вот (сокращенно) models.py:

class Program(models.Model):
    # ...
    complete = models.BooleanField()
    milestones = models.ManyToManyField(Milestone, through='ProgramMilestone')

class Milestone(models.Model):
    # ...

class Task(models.Model):
    # ...
    complete = models.BooleanField()
    milestone = models.ForeignKey(Milestone)

class ProgramMilestone(models.Model):
    # ...
    complete = models.BooleanField()
    program = models.ForeignKey(Program)
    milestone = models.ForeignKey(Milestone)

У меня есть ...through='ProgramMilestone', потому что Programs должно быть разрешено предоставить общий доступ Milestones, но он имеет статус завершения для каждой программы.

Проблема с этой схемой примерно такая:

  • У нас есть две программы: Программа 1 и Программа 2.
  • Программа 1 имеет этап A, а программа 2 также имеет этап A.
  • Добавление задачи в этап A программы 1..
  • Нежелательное последствие: задача теперь также прикреплена к Milestone A. программы 2.

Решением может быть создание двух «Milestone A» в базе данных Milestone: два разныхстроки с общим названием "Milestone A."Однако, учитывая, что они будут различаться только по id, будучи одним и тем же концептуальным элементом, это кажется пустой тратой.

Другая идея может заключаться в том, чтобы при добавлении нового и ProgramID, и MilestoneIDTask, но тогда я не уверен, что кто-то может добавить новые задачи в Django Admin - то есть, как передать ProgramID Программы, на которую в данный момент смотрит пользователь.

Как можетЯ настроил models.py так, чтобы Программы могли совместно использовать этапы, имея набор задач для каждой программы для каждого этапа (т. Е. Избегая описанного выше сценария)?

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Поскольку вы хотите, чтобы задачи были связаны с этапом программы, а не с этапами, вы можете изменить класс задач на:

class Task(models.Model):
    # ...
    complete = models.BooleanField()
    programMilestone = models.ForeignKey(ProgramMilestone)
0 голосов
/ 30 июня 2011

С моей (внешней) точки зрения, номенклатура не совсем то, что вы хотите определить для своей схемы базы данных. Milestone A в рамках Программы 1 выглядит так, что, хотя он назван одинаково, он может иметь совершенно другой набор задач, чем «тот же» Milestone A в рамках Программы 2.

Я предлагаю вам провести различие между именем ключа и отображаемым именем. Например, в модели Milestone у вас может быть 2 имени: MilestoneKey, которое будет использоваться для внутреннего использования и храниться как нечто вроде «Program 1 Milestone A», и MilestoneName, которое будет что-то вроде «Milestone A».

В вашем приложении пользователи будут видеть только MilestoneName, а внутри вы можете отслеживать его как MilestoneKey.

Или, чтобы избежать этой сложности, просто заполните поле MilestoneName и назовите Milestone A Программы 2 равным Milestone X или Программу 2 - Milestone A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...