1

У нас есть три объекта, называемые Product, ProductType и ProductCategory.Вопрос о реляционном моделировании

Давайте сделаем вид, что у нас есть три вида ProductType: Book, Music и Video.

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

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

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

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

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

Как бы вы эту модель?

+1

@Ninja: неточная ссылка исправлена, ожидая ответа на нерешенные вопросы. – PerformanceDBA

ответ

3

продукта PRODUCT_TYPE

  • PRODUCT_TYPE_ID (рк)
  • PRODUCT_TYPE_DESCRIPTION

PRODUCT_CATEGORY

  • PRODUCT_CATEGORY_ID (рк)
  • PRODUCT_TYPE_ID (FK к PRODUCT_TYPE.PRODUCT_TYPE_ID)
  • PRODUCT_CATEGORY_DESCRIPTION

ПРОДУКТ

  • PRODUCT_ID (рк)
  • PRODUCT_TYPE_ID (FK к PRODUCT_TYPE.PRODUCT_TYPE_ID)

PRODUCT_CATEGORY_MAP

  • PRODUCT_ID (рк, Д к PRODUCT.PRODUCT_ID)
  • PRODUCT_CATEGORY_ID (рк, Д к PRODUCT_CATEGORY.PRODUCT_CATEGORY_ID)
  • PRODUCT_TYPE_ID (рк, Д к обоим PRODUCT.PRODUCT_TYPE_IDиPRODUCT_CATEGORY.PRODUCT_TYPE_ID)
+0

Ничего себе, не могли бы вы сделать этот шрифт немного больше, пожалуйста? Мне сложно его прочитать :-) – paxdiablo

+0

Продукт (1, 1) имеет ProductType (1, Music). У нас также есть ProductType (2, Видео). У нас есть ProductCategory (1, 2, Drama) для видео и ProductCategory (2, 1, Jazz) для музыки. Теперь мы можем иметь ProductCategoryMap (1, 1, 2), который является недопустимым. – Behrang

+0

В 'ProductCategoryMap (1, 1, 2)', 'PRODUCT_TYPE_ID' является' 2'. У нас есть строка в 'PRODUCT_TYPE' с' PRODUCT_ID 2' - i.e '(2, Video)' - и у нас есть строка в 'PRODUCT_CATEGORY', что ее' PRODUCT_TYPE_ID' также '2' - например. '(1, 2, Драма)'. Или я чего-то не хватает? – Behrang

2

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

Прояснение: Ваше заявление «Продукт имеет ProductType и может содержать много категорий продуктов» противоречит вашему описанию. Продукт может иметь только одну категорию продуктов (Fiction, Jazz), которая основана на ProductType (Book, Music).

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

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

Link to Product Classification

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

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

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

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

Link to Two Possible Models

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

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

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

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

+0

Может быть такой продукт, как «Звездные войны», который является фильмом и имеет две категории: «Урожай» и «Sci-Fi». Или в фильме могут быть категории «Ужас» и «Научная фантастика». – Behrang

+1

Итак, теперь вы говорите: продукт может иметь более одной категории. если да, кто выбирает, какую категорию продается продукт; и как (какие данные они используют) принимают ли они такое решение? Вы говорите: у продукта есть один ProductType; одна ProductCategory; КАЖДЫЙ из которых выбран из набора действительных ProductType-ProductCategories? – PerformanceDBA

+0

Подумайте о категории продуктов как ярлыке или ярлыке. Но когда продукт является музыкой, его можно пометить только некоторыми ярлыками, которые действительны для музыки. И они используются, когда администратор или оператор рекламируют новые продукты в системе. Поэтому он хочет добавить «Звездные войны», затем он помещает его в Video ProductType, а затем появляется список допустимых категорий для видео, и он может связать одну или несколько из этих категорий с продуктом. Сказав, что я думаю, что схема, которую вы предоставили, решает эту проблему. Возможно, это потребует незначительных изменений.Я дважды проверю это и дам вам знать. – Behrang

Смежные вопросы