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).
Здесь нет "хитрости", это прямая нормализация, которая поддерживает определенные вами правила.
Ссылка на классификацию продуктов
Я не понимаю необходимости таблицы "карта".
Я предоставил суррогатный ключ для продукта, но, конечно, вам нужны другие ключи, чтобы реализовать разумные ограничения.
Ответы на комментарии
Итак, ваши требования не ясны, и, похоже, они сейчас меняются. Когда вы ответите на мои конкретные вопросы в комментариях, модель, необходимая для поддержки вашего требования, будет легкой. Чтобы помочь, я опубликовал две возможности. Конечно, это неполно, в ожидании ваших ответов:
Ссылка на две возможные модели
Кажется, что "жесткость" вашего контроля администратора и пользователей очень слабая. Пожалуйста, выберите один из следующих вариантов, чтобы мы могли продвинуться и закрыть вопрос:
Product.ProductType устанавливается администратором. Это позволяет администратору и пользователям выбирать любую допустимую категорию продуктов для Product.ProductType для любого использования.
Для каждого продукта администратор выбирает ProductType и подмножество ProductCategories (из списка ProductCategories, которые действительны для Product.ProductType). Затем пользователи могут использовать только те категории продуктов, которые были выбраны администратором для продукта, для любого использования.
Ответьте пожалуйста, и тогда я опубликую окончательный вариант.