Не рекомендуется хранить имена таблиц в качестве значений столбцов. Это плохой взлом.
Есть два стандартных способа сделать то, что вы пытаетесь сделать. Первый называется наследование одной таблицы . Это легко понять с помощью инструментов ORM, но обойдется без нормализации. Идея состоит в том, что все эти объекты - Person
, Vehicle
, что угодно - хранятся в одной таблице, часто с несколькими неиспользуемыми столбцами на запись, вместе с полем дискриминатор , который определяет, какой тип сущность.
Поле дискриминатора, как правило, представляет собой целочисленный тип, который сопоставлен с некоторым перечислением в вашем коде. Это также может быть внешний ключ для некоторой таблицы поиска в вашей базе данных, определяющий, какие номера соответствуют каким типам ( не имена таблиц, только описания).
Другой способ сделать это - наследование нескольких таблиц , которое лучше для вашей базы данных, но не так легко отобразить в коде. Вы делаете это, имея базовую таблицу , которая определяет некоторые общие свойства всех объектов - возможно, просто идентификатор и имя - и все ваши "конкретные" таблицы (Person
и т. Д.) Используют базу Идентификатор как уникальный внешний ключ (обычно также первичный ключ).
В первом случае исключительность является неявной, поскольку все объекты находятся в одной таблице. Во втором случае существует связь между Item
и base ID объекта, что также гарантирует уникальность.
Обратите внимание, что при наследовании нескольких таблиц возникает другая проблема - вы не можете гарантировать, что базовый идентификатор используется ровно одной таблицей наследования. Он может быть использован несколькими или не использоваться вообще. Вот почему схемы наследования нескольких таблиц обычно также имеют столбец дискриминатора, чтобы определить, какая таблица является «ожидаемой». Опять же, этот дискриминатор не содержит имя таблицы, он содержит значение поиска, которое потребитель может (или не может) использовать, чтобы определить, к какой другой таблице присоединиться.
Наследование нескольких таблиц ближе к вашей текущей схеме, поэтому я рекомендовал бы пойти на это, если вам не нужно использовать это с Linq to SQL или аналогичным ORM.
Смотрите здесь подробное руководство: Реализация наследования таблиц в SQL Server .