我们有三个名为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
的{{1}}应与其{{1}}匹配),而不使用应用程序代码或触发器等 - 只使用表格,外键等
你会如何塑造这个?
答案 0 :(得分:3)
PRODUCT_TYPE.PRODUCT_TYPE_ID
)PRODUCT_TYPE.PRODUCT_TYPE_ID
)PRODUCT.PRODUCT_ID
)PRODUCT_CATEGORY.PRODUCT_CATEGORY_ID
)PRODUCT.PRODUCT_TYPE_ID
和 PRODUCT_CATEGORY.PRODUCT_TYPE_ID
)答案 1 :(得分:2)
这很容易,这是一个简单的两级分类问题。在您的应用中,您需要两个单独的下拉菜单,在选择ProductType后,填充了ProductCategory。
一个澄清:您的声明“产品具有ProductType并且可以包含许多ProductCategory”与您的描述相矛盾。产品只能有一个产品类别(小说,爵士),它基于ProductType(书籍,音乐)。
此处不需要代理键(可能存在其他建模要求),这里只是多余的。对于像这样的简单分类,CHAR(1)或(2)更好,用户和开发人员友好(当你扫描输出,你知道“B”意味着“书”等),以及比任何数字更快密钥(当然除了tinyint)。
这里没有“技巧”,它是直接规范化,它支持您识别的规则。
Link to Product Classification
我不明白是否需要“地图”表。
我为Product提供了一个代理键,但当然你需要其他键,以实现合理的约束。
回复评论
好的,所以你的要求不明确,现在看来它们正在改变。当您在评论中回答我的具体问题时,支持您的要求所需的模型将很容易。为了提供帮助,我发表了两种可能性。当然它是不完整的,等待你的回答:
您的控制管理员与用户之间的“紧张”似乎非常松散。请选择以下其中一项,以便我们可以继续并结束问题:
Product.ProductType由admin设置。这允许管理员和用户为Product.ProductType选择任何有效的ProductCategories,用于他们拥有的任何用途。
对于每个产品,管理员选择ProductType 和 ProductCategories的子集(来自对Product.ProductType有效的ProductCategories列表)。用户可以然后仅使用产品管理员选择的 选择,无论他们有什么用途。
请回复,然后我将发布最终版本。