База данных Super-type / Sub-type Design [дубликат]

Я бы просто попробовал и вызвал программу, например, --version или --help и проверить, была ли команда успешной или неудачной

Используется с set -e выйдет, если программа не найдена, и вы получите осмысленное сообщение об ошибке:

#!/bin/bash
set -e
git --version >> /dev/null

8
задан Air 4 April 2016 в 18:55
поделиться

4 ответа

Замечание ER

Существует несколько сообщений ER. Я не знаком с тем, который вы используете, но достаточно ясно, что вы пытаетесь представить подтип (например, наследование, категорию, подкласс, иерархию обобщений ...). Это реляционный двоюродный брат наследования ООП.

При выполнении подтипов вы, как правило, занимаетесь следующими проектными решениями:

  • Абстрактные против конкретного: может ли родитель инстанцирован? В вашем примере: существует ли Vehicle без , также являющийся 2WD или 4WD? 1
  • Inclusive vs. exclusive: может быть создано несколько дочерних элементов для тот же родитель? В вашем примере может Vehicle быть как 2WD, так и 4WD? 2
  • . Полноценный или неполный: вы ожидаете, что в будущем будет добавлено больше детей? В вашем примере ожидаете ли вы, что Bike или Plane (и т. Д.) Могут быть позже добавлены в модель базы данных?

Обозначение Information Engineering различает включительно и исключительное отношение подтипа. Нозначение IDEF1X, с другой стороны, не распознает эту разницу (напрямую), но различает полный и неполный подтип (что не делает IE).

Следующая диаграмма из Справочник по методу ERwin (глава 5, Связывание подтипов) иллюстрирует разницу:

enter image description here [/g9]

Ни IE, ни IDEF1X не позволяют прямо указывать абстрактные или конкретные parent.

Физическое представление

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

  1. Поместить все классы в одну и ту же таблицу и оставить дочерние поля NULL. Затем вы можете иметь CHECK, чтобы убедиться, что правильное подмножество полей не равно NULL. Плюсы: Нет JOINING, поэтому некоторые запросы могут принести пользу. Могут применяться ключи на уровне родителя (например, если вы хотите избежать использования различных транспортных средств 2WD и 4WD с одинаковым идентификатором). Можно легко обеспечить включение инклюзивных против эксклюзивных детей и абстрактных против конкретного родителя (просто изменяя ПРОВЕРКУ). Минусы: Некоторые запросы могут быть медленнее, поскольку они должны отфильтровывать «неинтересные» дети. В зависимости от вашей СУБД ограничения, специфичные для ребенка, могут быть проблематичными. Многие NULL могут хранить данные о хранении. Менее подходит для неполного подтипирования - добавление нового ребенка требует изменения существующей таблицы, что может быть проблематичным в производственной среде.
  2. Поместите всех детей в отдельные таблицы, но у них нет таблицы для родителя (вместо этого повторяйте поля родителя и ограничения для всех детей). Имеет большинство характеристик (3), избегая при этом JOINs по цене меньшей ремонтопригодности (из-за всех этих повторений полей и ограничений) и невозможности принудительного использования ключей родительского уровня или представляет конкретного родителя.
  3. Поместите оба родителя и детей в отдельные таблицы. Плюсы: Чистота. Никакие поля / ограничения не должны быть искусственно повторяемы. Обеспечивает ключи родительского уровня и легко добавляет ограничения для конкретного ребенка. Подходит для неполного подтипирования (относительно легко добавить дополнительные таблицы для детей). Некоторым запросам может помочь только просмотр «интересных» дочерних таблиц. Минусы: Некоторые запросы могут быть JOIN-heavy. Может быть трудно обеспечить включение инклюзивных и эксклюзивных детей и абстрактных против конкретного родителя (они могут быть принудительно введены декларативно, если СУБД поддерживает круговые и отложенные внешние ключи, но принудительное их применение на уровне приложения обычно считается меньшее зло).

Как вы можете видеть, ситуация не идеальна - вам нужно идти на компромисс независимо от того, какой подход вы выберете. Подход (3), вероятно, должен быть вашей отправной точкой и выбирать только одну из альтернатив, если для этого есть веская причина.


1 Я предполагаю, что это то, что толщина линии соответствует вашим диаграммам.

2 Я предполагаю, что это означает наличие или отсутствие «непересекающихся» на ваших диаграммах.

17
ответ дан Branko Dimitrijevic 26 August 2018 в 23:52
поделиться

Существует не только один способ реализовать какую-либо конкретную модель данных. Часто происходит преобразование, которое происходит при переходе от логической модели к физической модели.

Стандартный SQL не имеет чистого способа принудительного ограничения ограничений подтипа.

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

Существует более или менее стандартный трюк SQL для принудительного ограничения непересекающихся ограничений. Это отводит некоторых людей, потому что это нарушает правила нормализации неважно. Тем не менее, некоторые люди находят технику эстетически оскорбительной, поскольку существует техническое нарушение 2NF.

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

1
ответ дан Joel Brown 26 August 2018 в 23:52
поделиться

Обычно, когда вы выполняете отношения типа Super-type / Sub-type в своем проекте базы данных, вам нужно создать отдельную таблицу для вашего типа общего типа (супертип) и отдельных таблиц для вашей специализированной версии / s (Sub -Type) несвязанный или нет. В вашем случае вам нужно будет создать таблицу для VEHICLE и первичного ключа и некоторых атрибутов, которые являются общими или разделяются всеми подтипами. Затем вам нужно будет создать отдельные таблицы для 2WD и 4WD вместе с атрибутами, специфичными только для этих таблиц. Например,

[/g0]

, тогда вы можете запросить эти таблицы с помощью SQL-соединений

2
ответ дан Mohsen Safari 26 August 2018 в 23:52
поделиться

Другие ответчики сказали, плюс следующее, которое входит в первичные ключи для таблиц подкласса.

Ваше дело выглядит как экземпляр шаблона проектирования, известного как «Специализация обобщения», или Gen-Spec для краткости , Вопрос о том, как моделировать ген-спецификацию с использованием таблиц базы данных, появляется все время в SO.

Если вы моделировали ген-spec в OOPL, например Java, вы использовали бы средство наследования подкласса для принятия заботиться о деталях для вас. Вы бы просто определили класс, чтобы позаботиться об обобщенных объектах, а затем определите коллекцию подклассов, по одному для каждого типа специализированного объекта. Каждый подкласс расширяет обобщенный класс. Это легко и просто.

К сожалению, реляционная модель данных не имеет встроенного наследования подкласса, и, как мне известно, системы баз данных SQL не предоставляют никаких подобных средств. Но тебе не повезло. Вы можете проектировать свои таблицы для моделирования gen-spec таким образом, который параллелен кластерной структуре ООП. Затем вам необходимо организовать реализацию собственного механизма наследования при добавлении новых элементов в обобщенный класс. Подробности следуют.

Структура класса довольно проста: одна таблица для класса gen и одна таблица для каждого подкласса spec. Вот хорошая иллюстрация, с сайта Мартина Фаулера. Наследование классов. Обратите внимание, что на этой диаграмме Cricketer является как подклассом, так и суперклассом. Вы должны выбрать, какие атрибуты входят в таблицы. На диаграмме показан один пример атрибута в каждой таблице.

Трудная деталь заключается в том, как вы определяете первичные ключи для этих таблиц. Таблица gen class получает первичный ключ обычным способом (если эта таблица не является специализацией еще одного обобщения, например Cricketers). Большинство дизайнеров дают первичному ключу стандартное имя, например «Id». Они используют функцию autonumber для заполнения поля Id. Таблицы классов spec получают первичный ключ, который можно назвать «Id», но функция autonumber не используется. Вместо этого первичный ключ каждой таблицы подкласса ограничивается ссылкой на первичный ключ обобщенной таблицы. Это делает каждый из специализированных первичных ключей внешним ключом, а также первичным ключом. Обратите внимание, что в случае Cricketers поле Id будет ссылаться на поле Id в Players, но поле Id в Bowlers будет ссылаться на поле Id в Cricketers.

Теперь, когда вы добавляете новые элементы, вам необходимо поддерживать ссылочную целостность. Вот как это сделать. Сначала вы вставляете новую строку в таблицу gen, предоставляя данные для всех своих атрибутов, за исключением первичного ключа. Механизм autonumber генерирует уникальный первичный ключ. Затем вы вставляете новую строку в соответствующую таблицу спецификаций, включая данные для всех ее атрибутов, включая первичный ключ. Первичный ключ, который вы используете, это копия только что созданного первичного ключа. Это распространение первичного ключа можно назвать «наследованием бедных людей».

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

2
ответ дан Walter Mitty 26 August 2018 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: