1

我们有三个实体,分别称为ProductProductTypeProductCategory

假设我们有三种ProductTypeBookMusicVideo

我们有三个不同ProductCategoryBook: Fiction, Novel, Technical

三个不同ProductCategoryMusic: Rock, Jazz, Pop

我们有三个不同ProductCategoryVideo: Fiction, Comic, Drama

AProduct有 aProductType并且可以有许多ProductCategory's。但它ProductCategory的应该匹配它的ProductType。例如,如果ProductTypeis Book,则只能取Fiction,NovelTechnicalas ProductCategory

是否可以在不使用应用程序代码或触发器等的情况下使用此限制(即ProductCategoryaProduct应该与其匹配ProductType)对这个模式进行建模——只使用表、外键等。

你会如何建模?

4

2 回答 2

3

产品类别

  • PRODUCT_TYPE_ID (pk)
  • PRODUCT_TYPE_DESCRIPTION

产品分类

  • PRODUCT_CATEGORY_ID (pk)
  • PRODUCT_TYPE_ID(转至PRODUCT_TYPE.PRODUCT_TYPE_ID
  • PRODUCT_CATEGORY_DESCRIPTION

产品

  • PRODUCT_ID (pk)
  • PRODUCT_TYPE_ID(转至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
于 2010-10-30T01:17:03.107 回答
2

这很容易,这是一个简单的两级分类问题。在您的应用程序中,您需要两个单独的下拉菜单,在选择 ProductType后填充 ProductCategory。

一个澄清:你的陈述“一个产品有一个产品类型并且可以有很多产品类别”与你的描述相矛盾。一个产品只能有一个产品类别(小说、爵士乐),它基于一个产品类型(书籍、音乐)。

这里不需要代理键(可能有其他建模要求),它们在这里只是多余的。对于像这样的简单分类,CHAR(1) 或 (2) 更好,对用户和开发人员友好(当您扫描输出时,您知道“B”表示“Book”等),并且比任何数字都快键(当然除了 tinyint)。

这里没有“技巧”,它是直接的标准化,它支持您确定的规则。

链接到产品分类

我不明白需要一个“地图”表。

我已经为 Product 提供了一个代理键,但是您当然需要其他键,以实现合理的约束。

对评论的回应

好的,所以您的要求尚不清楚,看来它们现在正在发生变化。当您在评论中回答我的具体问题时,支持您的要求所需的模型将很容易。为了提供帮助,我发布了两种可能性。当然是不完整的,等待你的回答:

链接到两个可能的模型

您对管理员与用户的控制“紧密”似乎非常松散。请选择以下选项之一,以便我们继续并结束问题:

  1. Product.ProductType 由管理员设置。这允许管理员和用户为 Product.ProductType 选择任何有效的 ProductCategories 用于他们拥有的任何用途。

  2. 对于每个产品,管理员选择 ProductTypeProductCategories 的子集(从对 Product.ProductType 有效的 ProductCategories 列表中)。然后,用户只能使用管理员为产品选择的 ProductCategories ,无论他们有什么用途。

请回复,然后我将发布最终版本。

于 2010-10-30T04:40:14.697 回答