Ваш второй подход (одна таблица для каждого типа) является каноническим способом решения этой проблемы - хотя для его реализации требуется немного больше усилий, он лучше соответствует реляционной модели большинства баз данных и сохраняет согласованныйи связное представление данных.Подход использования одной таблицы на конкретный тип работает хорошо и совместим с большинством библиотек ORM (таких как EntityFramework и NHibernate).
Однако существует несколько альтернативных подходов, иногда используемых, когда числоподтипов очень велико, или подтипы создаются на лету.
Альтернатива # 1: Таблица расширений Key-Value. Это таблица с одной строкой на дополнительное поледанных, которые вы хотите сохранить, внешний ключ обратно в основную таблицу (Task) и столбец, в котором указано, что это за поле.Его структура, как правило, выглядит примерно так:
TaskExt Table
=================
TaskID : Number (foreign key back to Task)
FieldType : Number or String (this would be AccountID, SalesPersonID, etc)
FieldValue : String (this would be the value of the associated field)
Альтернатива # 2: Таблица расширений с отображением типа. В этом варианте вы создаете таблицу с кучей обнуляемых столбцов различных данных.типы (числа, строки, дата / время и т. д.) с такими именами, как DATA01, DATA02, DATA03 ... и т. д.Для каждого типа задач вы выбираете подмножество столбцов и сопоставляете их с определенными полями.Таким образом, DATA01 может оказаться BuildVersion для SoftwareTask и AccountName для SalesTask.При таком подходе вы должны где-то управлять метаданными, которые управляют тем, к какому столбцу вы привязываете определенные поля.Таблица отображения типов часто выглядит примерно так:
TaskExt Table
=================
TaskID : Number (foreign key back to task)
Data01 : String
Data02 : String
Data03 : String
Data04 : String
Data05 : Number
Data06 : Number
Data07 : Number
Data08 : Number
Data09 : Date
Data10 : Date
Data11 : Date
Data12 : Date
// etc...
Основное преимущество варианта № 1 заключается в том, что вы можете динамически добавлять столько разных полей, сколько вам нужно, и даже поддерживатьуровень обратной совместимости.Однако существенным недостатком является то, что даже простые запросы могут стать сложными, поскольку поля объектов поворачиваются в строки в таблице.Отмена поворота оказывается сложной и часто плохо выполняемой операцией.
Преимущества варианта №2 заключаются в простоте реализации и сохранении соответствия между строками в соотношении 1: 1, что упрощает запросы.,К сожалению, в этом есть и недостатки.Во-первых, имена столбцов полностью неинформативны, и вам необходимо обратиться к некоторому словарю метаданных, чтобы понять, какие столбцы соответствуют какому полю для какого типа задачи.Вторым недостатком является то, что большинство баз данных ограничивают количество столбцов в таблице относительно небольшим числом (обычно 50–300 столбцов).В результате вы можете использовать только столько числовых, строковых столбцов, столбцов даты и времени, доступных для использования.Таким образом, если при вводе текста у вас будет больше полей DateTime, чем поддерживает таблица, вам придется либо использовать строковые поля для хранения дат, либо создать несколько таблиц расширений.
Будьте предупреждены, большинство библиотек ORM не предоставляют встроенных-в поддержке любого из этих шаблонов моделирования.