Relational modelling question

We have three entities called Product, ProductType, а также ProductCategory,

Let's pretend we have three kinds of ProductType: Book, Music, а также Video,

We have three different ProductCategoryдля Book: Fiction, Novel, Technical,

Three different ProductCategoryдля Music: Rock, Jazz, Pop,

And we have three different ProductCategoryдля Video: Fiction, Comic, Drama,

Product имеет ProductType и может иметь много ProductCategory"S. Но это ProductCategory's should match its ProductType, For example, if its ProductType является Book, it can only take Fiction, Novel, а также Technical как ProductCategory"S.

Is it possible to model this schema with this restriction (ie that ProductCategoryэто для Product should match with its ProductType) without using application code or triggers, etc -- Just using tables, foreign keys, etc.

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

2 ответа

ТИП ПРОДУКТА

  • PRODUCT_TYPE_ID (шт.)
  • PRODUCT_TYPE_DESCRIPTION

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

  • 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 (pk, fk to PRODUCT.PRODUCT_ID)
  • PRODUCT_CATEGORY_ID (pk, fk to PRODUCT_CATEGORY.PRODUCT_CATEGORY_ID)
  • PRODUCT_TYPE_ID (pk, fk для обоих PRODUCT.PRODUCT_TYPE_ID а также PRODUCT_CATEGORY.PRODUCT_TYPE_ID)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам