Сомнительные отношения SQL - PullRequest
0 голосов
/ 30 мая 2018

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

Odd relationship between Securities table and it's relating tables.

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

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

Я предполагаю, что мой вопрос заключается в том, служит ли этот метод связывания таблиц какой-либо полезной цели в SQL или EF?Мне кажется, что для того, чтобы создать новую запись для одной таблицы, всем таблицам потребуется новая запись, в которой я действительно запутался.

1 Ответ

0 голосов
/ 30 мая 2018

В терминологии ORM и EF эта настройка называется «Таблица на тип» парадигмы наследования, где есть таблица для каждого подкласса, таблица базового класса, и первичный ключ используется совместноподклассы и базовый класс.

например. В этом случае Securities_Stock и Securities_MutualFund являются двумя подклассами Securities базового класса / таблицы (возможно, абстрактного).

Отношениебудет 0..1 (subclass) to 1 (base class) - т.е. для каждой базовой таблицы Securities строка будет существовать только одна из записей в Securities_MutualFund или Securities_Stock.

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

Также обычно для обеспечения ссылочной целостности между подклассами к базовой таблице используется внешний ключ.

Чтобы ответить на ваш вопрос, причина отсутствия FK между двумя таблицами подкласса instance заключается в том, что каждая instance (с уникальным идентификатором) будет когда-либо только в ОДНОЙ из таблиц подкласса - онаНельзя, чтобы один и тот же Security был и взаимным фондом, и акцией.

Вы правы, для добавления новой конкретной записи Security необходимо, чтобы в обеих базовых таблицах Securities была строка (сначала необходимо вставить, поскольку они являются FK из таблиц подкласса).в базовую таблицу), а затем в одну из таблиц подклассов вставляется строка с остальными «конкретными» данными.

Если внешний ключ был добавлен между Stock и Mutual Fund,было бы невозможно вставить новые строки в таблицы.

Полный шаблон часто выглядит так:

CREATE TABLE BaseTable
(
    Id INT PRIMARY KEY, -- Can also be Identity
    ... Common columns here

   Discriminator, -- Type usually has a small range, so `INT` or `CHAR` are common
);

CREATE TABLE SubClassTable
(
    Id INT PRIMARY KEY, -- Not identity, must be manually inserted
    -- Specialized SubClass columns here
    FOREIGN KEY (Id) REFERENCES BaseTable(Id)
);
...