我目前正在开发一个项目,其中数据库将包含具有变体的产品,我想知道在数据库中对此进行建模的最佳方法。
“有变化的产品”我的意思是像T恤这样的东西,一件衬衫会有各种尺寸和颜色,但仍然基本上是相同的项目。
这些将被分组为产品'家族',这让我觉得它很简单,因为我可以为家庭创建一个表格,并有一个链接家庭产品表来识别每个家庭的产品 - 使用假设每种变体都是单独的产品本身。
问题出现了这些变量产品的某些属性将是设定的数量/值 - 例如,颜色将是一组特定的颜色,但尺寸可以是任何东西,因为T恤(按照类比)是定制的这样做是基于测量的胸部尺寸。
由于项目的性质,无论何时创建产品,即使是“家庭”的一部分并且略有不同,该产品也需要所有信息。
TL; DR:
我不一定在寻找一个可以提供给我的数据库模型,只是一个正确方向的指针将是一个巨大的帮助,因为我很遗憾有效地做到这一点。
答案 0 :(得分:5)
假设您的产品中的功能集不相同(从您的问题中可以看出这一点),这种结构是有道理的:
这使您可以立即访问这些功能/等。你想要的,而不必担心'滑动比例'或诸如此类的东西。您还可以为要素表中的值设置非定量值的查找表(我认为您不会将其存储在要素表中,因为该表应为1行/要素)。如果您的功能非常接近每个产品的唯一性,那么您可以跳过1行/特征查找表并且只有多行特征值表,但听起来并非如此。
答案 1 :(得分:4)
这是一个相当普遍的问题 - 它通常被称为“我如何将对象继承映射到关系结构中”。有很多选择。
Joe描述的一般称为“实体/属性/值”或EAV。它非常灵活 - 您无需重新设计数据库即可应对各种各样的数据属性 - 但它很快就会出现复杂的查询 - 想象一下所有颜色为红色,尺寸为(M)的T恤,S,L),颈部大于44.
Craig Larman的书“应用UML和模式”中描述了以下备选方案 - 获取更多细节的副本。或者参见here。
首先,您可以在一个表中为每个子类之间的公共数据建模,并为每个子类分别创建一个表。在你的例子中,你有一个带有SKU等的“产品”表和一个带有colourID,chestMeasurement等的“T恤”表。这意味着有很多连接来检索多种不同的产品类型,但是给你一个相当“干净”的数据模型。
Larman描述的下一个模型是“超级表” - 你有一个表只包含所有可能的列。丑陋和笨拙,但如果你只有一些子类型,可能是最简单和最快的。
最后,“每个子类型一个表”选项 - 您只需将每个类型映射到其自己的表 - 例如“T恤”,“裤子”,“帽子”等。非常干净和可预测,但很难查询产品类型。
在明显的RDBMS解决方案之外,您还可以查看面向文档的解决方案,例如:通过使用数据库引擎对XML的支持。