схема django db - создание задач разных типов, каждое с разными полями - PullRequest
1 голос
/ 16 марта 2011

Каков наилучший дизайн БД с использованием django для следующего сценария:

У меня есть список компьютеров в базе данных. Я хочу добавить задачу, которая будет выполняться компьютером. Есть разные задачи, каждая с разными полями. Например, одна из них может быть «установить программу», которая имеет ForeignKey для таблицы программ, где записи содержат информацию о том, как установить программу. Или это может быть как «изменить настройку», содержащую ForeignKey в таблицу настроек.

Я думал о том, чтобы иметь TaskType с (имя, описание), но чтобы все вышеперечисленное работало, у каждого должен был быть внешний ключ для Program и Setting, даже если задача не использует ни того, ни другого. это кажется не лучшим ... есть другой способ?

Ответы [ 2 ]

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

Как описано, ваша концептуальная схема включает в себя следующие предикаты:

  • задача существует
  • компьютер существует
  • настройка существует
  • программа существует
  • задача выполняется на компьютере
  • задание - изменить значение
  • задача - установить программу

У вас также есть одно ограничение, вам нужно судить, насколько оно значимо:

  • | P6 присоединиться к P7 | = 0 - нет задачи для установки программы и изменения настройки

Некоторые могут предположить, что естественным решением Django будет использование наследования модели для представления базовой модели «Задача» с двумя подклассами - «InstallTask» и «SettingTask». Вы тогда либо несете «компьютер» в качестве атрибута базового класса или, альтернативно, другой модели «ComputerTask» или тому подобное.

Использование наследования модели даст некоторые преимущества, включая (1) получение некоторой поддержки для создания базовой задачи одновременно с созданием, скажем, ChangeTask, и (2) поощрение, но не принуждение к поддержанию ограничения .

Однако, по моему опыту, существуют концептуальные проблемы с наследованием модели, и вы можете столкнуться с неожиданным и нежелательным поведением, например, обновлением задач. В этом случае я мог бы просто поместить Задачу 1: 1 с InstallTask ​​и 1: 1 с SettingTask. Это на самом деле более гибкий.

0 голосов
/ 16 марта 2011

Не уверен насчет вашей конкретной проблемы (недостаточно данных), поэтому мой ответ будет немного абстрактным (или высокого уровня):)

ИМХО, похоже, вас могут заинтересовать родовые отношения , которые работают с типами контента.

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

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