这是我多年来在多个地方看到的场景。我想知道是否有人遇到过比我更好的解决方案...
我的公司销售的产品数量相对较少,但我们销售的产品是高度专业化的(即,为了选择给定的产品,必须提供大量的详细信息)。问题在于,虽然选择给定产品所需的细节数量相对恒定,但所需的细节种类在产品之间却有很大差异。例如:
产品 X 可能具有识别特征,例如(假设地)
- '颜色',
- '材料'
- “平均失败时间”
但产品 Y 可能具有特征
- '厚度',
- '直径'
- '能量源'
创建一个同时使用产品 X 和产品 Y 的订单系统的问题(其中之一)是订单行必须在某些时候引用它“销售”的内容。由于产品 X 和产品 Y 是在两个不同的表中定义的 - 并且使用宽表方案对产品进行非规范化不是一种选择(产品定义非常深) - 很难找到一种明确的方法来定义订单行订单输入、编辑和报告的实用性。
我过去尝试过的事情
- 创建一个名为“产品”的父表,其中包含产品 X 和产品 Y 共有的列,然后使用“产品”作为 OrderLine 表的引用,并在产品 X 的表之间创建一个以“产品”作为主要侧的 FK 关系和产品 Y。这基本上将“产品”表作为 OrderLine 和所有不同产品表(例如产品 X 和 Y)的父级。它适用于订单输入,但会导致订单报告或编辑出现问题,因为“产品”记录必须跟踪它是什么类型的产品,以确定如何将“产品”加入其更详细的子产品、产品 X 或产品Y.优点:保留了关键关系。 缺点:在订单行/产品级别进行报告、编辑。
- 在订单行级别创建“产品类型”和“产品密钥”列,然后使用一些 CASE 逻辑或视图来确定该行所指的定制产品。这类似于第 (1) 项,但没有通用的“产品”表。我认为它是一个更“快速和肮脏”的解决方案,因为它完全消除了订单行及其产品定义之间的外键。优点:快速解决。 缺点:同第(1)项,加上丢失RI。
- 通过创建一个通用标题表并使用自定义属性的键/值对(OrderLine [n] <- [1] Product [1] <- [n] ProductAttribute)来同质化产品定义。 优点:保留关键关系;产品定义没有歧义。 缺点:报告(例如,检索带有属性的产品列表)、属性值的数据类型、性能(获取产品属性、插入或更新产品属性等)
如果其他人尝试了不同的策略并取得了更大的成功,我肯定想听听。
谢谢你。