Вопрос по реляционному моделированию

У нас есть три объекта с именами Product, ProductType и ProductCategory.

Предположим, у нас есть три вида ProductType: Book, Music и Video.

У нас есть три разных ProductCategory для Book: Fiction, Novel, Technical.

Три разных ProductCategory для Music: Rock, Jazz, Pop.

И у нас есть три разных ProductCategory для Video: Fiction, Comic, Drama.

Product имеет ProductType и может иметь много ProductCategory. Но его ProductCategory должны соответствовать его ProductType. Например, если его ProductType равно Book, он может принимать только Fiction, Novel и Technical как ProductCategory.

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

Как бы вы это смоделировали?


person βξhrαng    schedule 30.10.2010    source источник
comment
@Ninja: неработающая ссылка исправлена, жду ваших ответов на нерешенные вопросы.   -  person PerformanceDBA    schedule 27.11.2010


Ответы (2)


ТИП ПРОДУКТА

  • PRODUCT_TYPE_ID (упак.)
  • PRODUCT_TYPE_DESCRIPTION

КАТЕГОРИЯ ПРОДУКТА

  • PRODUCT_CATEGORY_ID (упак.)
  • PRODUCT_TYPE_ID (от PRODUCT_TYPE.PRODUCT_TYPE_ID )
  • PRODUCT_CATEGORY_DESCRIPTION

ТОВАР

  • PRODUCT_ID (упак.)
  • PRODUCT_TYPE_ID (от PRODUCT_TYPE.PRODUCT_TYPE_ID)

PRODUCT_CATEGORY_MAP

  • PRODUCT_ID (pk, fk до PRODUCT.PRODUCT_ID)
  • PRODUCT_CATEGORY_ID (pk, fk до PRODUCT_CATEGORY.PRODUCT_CATEGORY_ID)
  • PRODUCT_TYPE_ID (pk, fk и PRODUCT.PRODUCT_TYPE_ID и PRODUCT_CATEGORY.PRODUCT_TYPE_ID)
person OMG Ponies    schedule 30.10.2010
comment
Вау, не могли бы вы сделать этот шрифт немного больше, пожалуйста? Мне тяжело читать :-) - person paxdiablo; 30.10.2010
comment
Product(1, 1) имеет ProductType(1, Music). У нас также есть ProductType(2, Video). У нас есть ProductCategory(1, 2, Drama) для видео и ProductCategory(2, 1, Jazz) для музыки. Теперь у нас может быть ProductCategoryMap(1, 1, 2), который недействителен. - person βξhrαng; 30.10.2010
comment
В ProductCategoryMap(1, 1, 2) PRODUCT_TYPE_ID есть 2. У нас есть строка в PRODUCT_TYPE с PRODUCT_ID 2 -- т.е. (2, Video) -- и у нас есть строка в PRODUCT_CATEGORY, в которой ее PRODUCT_TYPE_ID также 2 -- например. (1, 2, Drama). Или я что-то упускаю? - person βξhrαng; 30.10.2010
comment
@Bytecode Ninja: я не понимаю, как это недопустимо - тип и категория совпадают между PRODUCT_CATEGORY_MAP и PRODUCT_CATEGORY; тип совпадает между PRODUCT и PRODUCT_CATEGORY_MAP. - person OMG Ponies; 30.10.2010
comment
Только Video продукты могут иметь Drama. Теперь у нас есть продукт Music категории Drama. Ммм... куда делся ваш другой комментарий? :D - person βξhrαng; 30.10.2010
comment
@Bytecode Ninja: я исправил опечатку в своем ответе, указав на таблицу PRODUCT. Я бы не стал высмеивать тех, кто пытается помочь, когда им трудно понять, что вы пытаетесь сообщить. - person OMG Ponies; 30.10.2010
comment
Это все еще, кажется, та же проблема, что и раньше. - person βξhrαng; 30.10.2010

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

Одно уточнение: ваше утверждение "Продукт имеет ProductType и может иметь множество ProductCategory" противоречит вашему описанию. Продукт может иметь только одну категорию продукта (художественная литература, джаз), основанную на типе продукта (книга, музыка).

Здесь нет необходимости в суррогатных ключах (они могут быть в других требованиях к моделированию), они здесь просто избыточны. Для простых классификаций, подобных этой, CHAR(1) или (2) намного лучше, удобны для пользователя и разработчика (когда вы сканируете вывод, вы знаете, что «B» означает «Книга» и т. д.), а также быстрее, чем любой числовой key (кроме, конечно, tinyint).

Здесь нет «хитрости», это прямая нормализация, которая поддерживает определенные вами правила.

Ссылка на классификацию продуктов

Я не понимаю необходимости таблицы "карта".

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

Ответы на комментарии

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

Ссылка на две возможные модели< /а>

«Герметичность» вашего контроля над администратором и пользователями кажется очень слабой. Пожалуйста, выберите один из следующих вариантов, чтобы мы могли продолжить и закрыть вопрос:

  1. Product.ProductType устанавливается администратором. Это позволяет администратору и пользователям выбирать любую из допустимых ProductCategories для Product.ProductType для любого использования, которое у них есть.

  2. Для каждого продукта администратор выбирает ProductType и подмножество ProductCategories (из списка ProductCategories, допустимых для Product.ProductType). Пользователи могут затем использовать только те Категории Продуктов, которые выбраны администратором для Продукта, для любых целей, которые у них есть.

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

person PerformanceDBA    schedule 30.10.2010
comment
Может быть такой продукт, как «Звездные войны», который является фильмом и имеет две категории: «Винтаж» и «Научная фантастика». Или у фильма могут быть категории «Ужасы» и «Научная фантастика». - person βξhrαng; 30.10.2010
comment
Итак, теперь вы говорите, что Продукт может иметь более одной категории. если да, то кто выбирает, в какой категории продается продукт; и как (какие данные они используют) они принимают это решение? Вы говорите: продукт имеет один ProductType; одна категория товаров; КАЖДЫЙ из которых выбирается из набора действительных ProductType-ProductCategories ? - person PerformanceDBA; 30.10.2010
comment
Думайте о ProductCategory как о теге или ярлыке. Но когда Продуктом является Музыка, он может быть помечен только определенными ярлыками, действительными для Музыки. И они используются, когда администратор или оператор рекламирует в системе новые продукты. Итак, он хочет добавить «Звездные войны», затем помещает его в Video ProductType, а затем отображается список допустимых категорий для видео, и он может связать одну или несколько из этих категорий с продуктом. Сказав это, я думаю, что схема, которую вы предоставили, решает эту проблему. Возможно, ему просто нужны небольшие изменения. Я дважды проверю это и дам вам знать. - person βξhrαng; 30.10.2010
comment
Нет, я думаю, что ваше решение работает только тогда, когда продукт может иметь не более одной категории продукта. - person βξhrαng; 30.10.2010
comment
Да, как указано в моем посте. Это то, что вы определили в своем первоначальном требовании. Теперь вы просите о другом. Я задал уточняющие вопросы. Если и когда вы дадите ответы на эти вопросы, я смогу предоставить модель изменения. Пока (если вы снова не измените свое требование) ProductType и ProducCategory верны; отношения между ними и Продуктом находятся на рассмотрении, ожидая вашего разъяснения. Невозможно предоставить модель тому, кто не знает их требований. - person PerformanceDBA; 31.10.2010
comment
Мне не нужны описания, я все это знаю; Мне нужны конкретные ответы на мои конкретные вопросы в комментарии 2 выше: (1) КОГДА администратор добавляет фильм «Звездные войны», ИЗ нескольких категорий, доступных им для фильмов, КАК (на каком основании) они выбирают ОДНУ категорию. (2) ИЛИ, присваивают ли они «Звездным войнам» более одной категории, и если да, то (3) КАК МНОГО. - person PerformanceDBA; 31.10.2010
comment
Это то, что вы определили в своем первоначальном требовании. Теперь вы просите о другом. Я не изменил свой вопрос, и моим первоначальным требованием было: Продукт имеет ProductType и может иметь много ProductCategory. - person βξhrαng; 31.10.2010
comment
Неважно. А как насчет оставшихся конкретных вопросов в комментариях? - person PerformanceDBA; 31.10.2010