Описание тега single-table-inheritance

Наследование одной таблицы - это простейший из нескольких способов создания таблиц SQL, отражающих отношения класса / подкласса или обобщения / специализации.

Наследование одной таблицы - это простейший из нескольких способов создания таблиц SQL, отражающих отношения класса / подкласса или обобщения / специализации.

Наследование - это центральное понятие в объектном моделировании, которое рассматривается в моделях классов / подклассов. Это хорошо понимают люди, создающие объектно-ориентированные системы. Параллельная концепция в моделировании ER (Entity-Relationship) называется обобщением / специализацией. К сожалению, во многих введениях в ER-моделирование отсутствует обобщение / специализация, что позволяет новичку изобретать концепцию самостоятельно.

SQL как таковой не имеет механизма для реализации наследования. Существует несколько методов проектирования для имитации эффектов наследования в таблицах SQL. Самый простой из этих методов называется наследованием одной таблицы.

При наследовании одной таблицы одна таблица используется для хранения данных, которые относятся либо к суперклассу, либо к любому из его подклассов. У каждого атрибута будет свой столбец, а у каждого экземпляра - собственная строка.

Результатом такого дизайна является то, что все данные о любом члене класса могут быть получены без каких-либо соединений. Если пересечение данного столбца и данной строки неприменимо, оно остается как SQL NULL.

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

Нулевые значения могут быть проблематичными, когда они появляются в логических сравнениях, таких как проверка равенства в предложениях WHERE. В SQL логическая проверка может дать три возможности: ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО. Если одна или обе стороны в сравнении равны NULL, результатом будет UNKNOWN. Если проверка на равенство дает НЕИЗВЕСТНО, та же проверка на неравенство также дает НЕИЗВЕСТНО. Это может сбивать с толку людей, которые привыкли к двухзначной логике. Использование столбцов, допускающих значение NULL, в предложениях WHERE следует рассматривать очень внимательно, чтобы избежать неожиданных результатов.

Другая проблема заключается в том, что бывает сложно определить, к какому подклассу принадлежит данная строка. По этой причине отдельный столбец, часто называемый EntityType (например, VehicleType), используется для явного указания принадлежности к подклассу.

В сложных ситуациях есть две альтернативы наследованию одной таблицы. Один из них называется наследованием таблицы классов, у которого есть свой собственный тег: наследование таблицы классов. другой называется наследованием конкретной таблицы.