Сверхтяпинговые столы - это многократное наследование?

StackOverflow https://stackoverflow.com/questions/4109106

Вопрос

Возможно, что этот вопрос либо имеет простой ответ, который является стандартной практикой, либо не имеет ответа, потому что это не может быть сделано по простой причине, или в противном случае просто интересное мысль. В настоящее время я сижу на последнем варианте, но надеясь на первый ...

Допустим, я хочу создать «группу» или «класс» объектов в пределах моей модели данных. Вообще, я бы использовал столик Supertype, как это:

DrivableEntity
----------
ID (PK, auto-increment)
Type (int or otherwise some kind of enum)

Car
----------
ID (PK, FK to DrivableEntity)
(car-specific fields)

Bike
----------
ID (PK, FK to DrivableEntity)
(bike-specific fields)

Тогда мои вставки, вероятно, будут проходить через то, что внешне выглядит как нормальная процедура CRUD для каждого подзабора, но внутри DrivableEntity а затем использует идентификацию области для вставки в предполагаемый стол.

Будучи больше программиста, чем модельером данных, это заставило меня думать о наследстве объектов. Для прямого наследования это здорово. Общие данные / задачи могут быть абстрагированы на уровне, замена Liskov может быть сохранена и т. Д. Но является многократным наследством возможной в модели данных?

Я в первую очередь C # разработчик, поэтому я начал думать с точки зрения интерфейсов. Что если я хотел разоблачить таблицы, которые «реализованы» IDrivable и / или ITowable, и т. д. и т. Д. Это возможное это возможно? Кто-нибудь сделал все, как это раньше?

Это было полезно?

Решение

Обычно два подхода к модели данных хорошо работают для того, что вы описали.

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

DrivableEntity
----------
ID (PK, auto-increment)
Type (int or otherwise some kind of enum)

Car
----------
ID (PK, FK to DrivableEntity)
(car-specific fields)

Bike
----------
ID (PK, FK to DrivableEntity)
(bike-specific fields)

Другой подход состоит в том, чтобы сохранить все столбцы отнутыми в одной таблице и отметьте каждую строку с индикатором типа. Этот подход может быть грязным быстро, но имеет гораздо меньше над головой для простых случаев.

Вы можете моделировать наследство или интерфейсы в вашей оригинальной модели, просто добавив другой столбец внешнего ключа в одну из «производных» объектов. Например:

FlyableEntity
-------------
ID (PK)
... flyable attributes

FlyingCar (implements/inherits IDrivable and IFlyable)
-------------
DrivableEntityID (PK, FK)
FlyableEntityID (PK, FK)
... add flying car attributes

or:

FlyingCar (inherits from Car)
-------------
CarID (PK, FK)
FlyableEntityID (FK)
... add flying car attributes

Другие советы

Дэйвид,

Основная структура имеет возможность использовать наследство. Это хороший обзор наследования в рамках объекта. Отказ Вы можете использовать Poco с EF, чтобы создать свои собственные интерфейсы для обеспечения доступа к данным.

Ситуация, которую вы описываете, не совсем многократное наследование, так как у вас есть одна базовая таблица / сущность и для производных таблиц / объектов. Чтобы моделировать это в EF, вы создаете базовую сущность, затем создайте каждый дочерний объект. На данный момент вы можете сопоставить карту детских сущностей проперив каждого типа на правильный стол.

С этим сказанным, ваша вставка / обновление / удаление логики собирается получить очень сложную. Основная структура может столкнуться с проблемами со сложной моделью.

Вопрос, который у меня был бы, почему ты это делаешь? Если это необходимо поделиться общими данными между типами, я бы порекомендовал создать представления на сервере, который присоединяется к родительской таблице с детскими таблицами. Это будет намного быстрее, и вы можете обрабатывать операции CUD (Create / Update / Delete) с вместо триггера Что сделает для облегчения SQL, так как существует четкое разделение между доступом к данным и хранилище данных.

Имеет ли это смысл?

Erick.

Вы можете создать представления, чтобы решить эту проблему.

ViewDriveAleCar.
ViewDrivabalebike.
ViewTowableCar.

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

CREATE VIEW vrDiveTow
AS

SELECT
viewDriveableCar.CarId as ID,
... other attributes

UNION

SELECT
viewTowableCar.TowableId as ID,
... other attributes
UNION

Большая Гочь. Отказ SQL использует планы запроса, которые могут быть кэшированы для получения результатов. Если план запроса SQL построен вокруг запроса на «Seven-Up», и вы фильтруете для «Coke», то план запроса неэффективна, а в полной табличном сканировании.

Подтипон возможен, но также обескураживается. Базы данных являются самими мира, и вы не должны пытаться принести принципы ООП в этот мир. Многие пытались, многие потерпели неудачу. Если вы попытаетесь подумать о базе данных «Объекты» в условиях OOP, ваша база данных пострадает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top