2011-04-14 98 views
0

我正在寻找一个最佳实践解决方案....数据库设计 - 如何将项目与同一个表中的多个项目相关联?

我有一个表,其中包含产品称为产品,某些产品有其他产品(选项),需要与他们关联,以便当用户查看产品他们也收到与其相关的所有其他产品(选项)的列表。

我的第一本能是创建一个简单的参考表。虽然这有效,但您会发现可能会有大量冗余数据。

**Ref table** 
Product, product (option) to be associated 

widget1, widget2 
widget1, widget3 
widget4, widget2 and so on... 

我的下一个尝试是合并一个关键表。

**Products table** 
product_id 
key_id 

**Key table** 
key_id 
product_id_fk 

key_id不是唯一的,因为一个密钥应该能够引用多个产品(选项)。

这个工作稍微好一些,但如果所有选项集都假设是唯一的,它仍然会导致问题。这种方法只允许一个设置参考(一组选项)与产品相关联。

我相信解决这个问题最有效的方法之一是创建所有独特的选项集,然后将每个独特的集合引用到产品中。一些帮助?

+0

是否所有的产品选项都依赖于一个且只有一个产品?产品选件可以独立销售吗? – 2011-04-14 16:36:01

+0

所有的产品选项都不依赖于一个且只有一个产品。产品可以是一个系列的一部分,通常一个选项被设计为适合整个系列..但并非总是如此。选项可以独立销售,这就是为什么我将它们包含在产品表中。 – payling 2011-04-14 16:43:31

回答

1

什么是参考表中的“冗余数据”问题?

  • A & B之间的关系总是互惠吗?如果我们谈论的是产品和选择,我会倾向于不这么认为(例如,如果您销售的手机提供附件列表作为选项,则可能是有意义的,但如果某人是看着手机的情况下,建议他们购买新手机)。但是,如果它们是互惠的,那么widget2, widget1行将是多余的,因为您已经捕获了与widget1, widget2行的关系。
  • 我假设你在说明你的参考表时,你正在为widget1,widget2和widget3存储product_id这两列,你写的是“widget1”,而不是存储实际的产品名,这个名可能比product_id长得多
+0

我犯了一个错误,即将窗口小部件1与窗口小部件1相关联。第二列旨在成为一个选项。我输入太快没有意识到这些影响......我纠正了这个例子。 – payling 2011-04-14 17:35:03

+0

@payling - 我更新了我的答案以删除第一个要点。 – 2011-04-14 17:44:47

+0

这种关系是互惠的。 “产品”的产品页面应显示相关选项。 “选项”的产品页面应显示相关产品。 我目前将产品名称存储为表格的主键,因为所有产品都有唯一的名称。当我说的名字,我的意思是型号(字母/数字的组合)...... – payling 2011-04-14 17:52:41

相关问题