Прежде всего, давайте установим, для чего обычно используется наследование одной таблицы.Это способ объединить хранение и поведение нескольких вещей, которые похожи друг на друга.Придерживаясь CMS, примером может служить таблица с posts
, которая может быть либо Comment
, либо Article
.Они имеют схожие данные и поведение, но в конечном итоге это разные вещи.Независимо от того, является ли комментарий комментарием, не является состоянием объекта , это идентичность.
Однако в вашем примере, является ли страница общедоступной или приватной, общей или нетили скрытый, кажется, является частью состояния страницы.Хотя наследование одной таблицы может технически работать (при условии, что все подклассы являются взаимоисключающими), оно не подходит.
Состояние должно быть реализовано в одном или нескольких столбцах .Атрибут, который представляет определенное двойное состояние, может быть указан как логическое значение; да или нет .Если страница всегда частная или общедоступная , вы можете смоделировать ее как один логический столбец private
.Если оно не является частным, оно является общедоступным (или наоборот).
В некоторых случаях вы можете сохранить три или более различных состояния, которые являются взаимоисключающими.Например, страница может быть либо частной, либо общедоступной, либо общей (я не знаю, так ли это - давайте представим, что это так).В этом случае логическое значение не поможет.Вы можете использовать несколько логических флагов, но, как вы правильно заметили, это очень запутанно.Самый простой способ - смоделировать это как перечисление .Или, когда вам этого не хватает (как в случае с Rails), просто используйте строковые значения со специальным значением и добавьте проверку, гарантирующую, что вы используете только одно из значений private
, public
или shared
.
Иногда определенные комбинации различных переменных состояния являются недействительными .Например, страница может быть черновиком или утвержденным (отражается логическим столбцом approved
);и это также либо public или private (также отражается логическим столбцом).Мы могли бы решить, что страница должна должна быть утверждена, прежде чем она будет обнародована.В этом случае мы объявляем одно из состояний недействительным.Это должно отражаться в проверке вашей модели .Важно понимать, что черновик , общедоступная страница не является принципиально невозможной, это невозможно только потому, что вы решаете, что этого не должно быть.
При создании модели тщательно различайте атрибуты, которые отражают фактические свойства и состояния субъектов в реальном мире, и бизнес-правила , которые определяют, что должно быть возможным, ичто не должно бытьПервый должен быть смоделирован как столбцы, второй - как проверки.
Исходный ответ:
Одно очевидное отличие состоит в том, что логические флаги позволяютбыть отмеченным как президент и охранник одновременно.Если ваша модель должна допускать такие ситуации, наследование одной таблицы вам не подойдет.
С другой стороны, может быть Person
, который является президентом , ведет себя иначе, чем обычный человек;и один человек может только быть президентом или охранником.В этом случае наследование может быть более подходящим.Я не думаю, что вы должны моделировать "неполный рабочий день" как подкласс, хотя.Это атрибут в любом случае.
Существует также важный третий вариант, когда вы полностью отделяете задание или роль человека от модели.Один человек имеет одно (или много?) заданий , которые работают неполный рабочий день.Преимущество этой модели состоит в том, что вы отделяете атрибуты человека от атрибутов их работы.В конце концов, люди меняют работу, но это не делает их буквально другим человеком.В конечном итоге мне кажется, что это самый реалистичный способ смоделировать вашу ситуацию.