Для вашего случая, если какая-то информация доступна только тогда, когда она закрыта, я бы действительно посоветовал создать отдельную модель.
Присоединения неплохие. Особенно в вашем случае объединение будет быстрее, если у вас есть все строки в одной таблице и намного меньше строк в другой. Я много работал с базами данных, и в большинстве случаев можно догадаться, будет ли объединение лучше или хуже. Даже полное сканирование таблицы лучше, чем использование индекса во многих случаях. Вам нужно посмотреть на ОБЪЯСНЕНИЯ, если производительность вызывает беспокойство, и по возможности профилировать работу с БД (я знаю, что Oracle поддерживает это). Но прежде чем производительность станет проблемой, я предпочитаю более быструю разработку.
У нас есть таблица в Django с 5M строками. И нам нужен был столбец, который был бы не нулевым только для 1К строк. Простое изменение таблицы заняло бы полдня. Восстановление с нуля также занимает несколько часов. Мы решили сделать отдельную модель.
Я был на лекции по доменно-ориентированному проектированию, в которой автор объяснял, что важно, особенно при разработке нового приложения, разделять модели, чтобы не объединять все в одном классе.
Допустим, у вас есть класс CargoAircraft и PassengerAircraft. Так заманчиво поместить их в один класс и работать "без проблем", не так ли? Но взаимодействия с ними (планирование, резервирование, расчеты веса или мощности) совершенно разные .
Итак, помещая все в один класс, вы заставляете себя связывать предложения IF в каждом методе, дополнительные методы в Manager, усложнять отладку, большие таблицы в БД. В основном вы заставляете себя тратить больше времени на разработку ради чего? Только для двух вещей: 1) меньше объединений 2) меньше имен классов.
Если вы разделяете классы, дела идут намного проще:
- чистый код, без уродливых if, no .getattr и значений по умолчанию
- легкая отладка
- больше поддерживаемой базы данных
следовательно, более быстрое развитие.