我正在为数据库中的产品设计关系数据库。这是一个大纲
产品(名称,ID,类别,价格,位置......)
我坚持认为每个产品可以有多个类别。我如何处理这是一个BCNF设计?我正在考虑制作一个单独的表来映射Id - >类别,但这里没有功能依赖,因为每个Id可以有多个类别......
有人可以向我解释一下类别中的功能依赖性以及如何在BCNF设计中解决它吗?
答案 0 :(得分:1)
来自:http://www.google.com/url?sa=t&rct=j&q=multivalued%20attributes%20in%20relational%20tables&source=web&cd=2&ved=0CCYQFjAB&url=http%3A%2F%2Fwww.cs.sjsu.edu%2Ffaculty%2Flee%2Fcs157%2F26Presentation_Jung_T_Chang.ppt&ei=f2SgTsr3NqnA0AGo2dCeBQ&usg=AFQjCNH_RoewSGJRuT4KOMtudGnX0uMimw&cad=rja(如何将ER模型转换为关系模型By:Jung T. Chang):
For each multivalue attribute in an entity set/relationship set:
- Build a new relation schema with two columns
- One column for the primary keys of the entity set/relationship set that has the multivalue attribute
- Another column for the multivalue attributes. Each cell of this column holds only one value. So each value is represented as an unique tuple
- Primary key for this schema is the union of all attributes
他的powerpoint的一个例子: (我尝试从他的强力点上传一个屏幕截图,但是imgurl现在不适合我....请查看上面链接中的幻灯片#19以查看示例)
在您的情况下,它取决于Product
和Category
之间的关系。
如果它是多对一关系(意味着每个产品的类别都是唯一的,但每个产品都有多个):创建一个Categories
表,外键指向Product表。
如果它是多对多关系(意味着一个Product
可以包含多个Categories
且任何一个Category
都可以属于多个Products
,则为“关联实体” “(http://en.wikipedia.org/wiki/Associative_Entities)是必需的。这基本上是一个简单的”map“表,其中包含Product表的外键,以及Categories表的外键和组合这两个中创建了一个复合主键(http://en.wikipedia.org/wiki/Compound_key)。
您在评论中提到Category
是Product
的多值属性,这意味着对于单个产品,产品属于多个类别。使用任何多值属性,您将需要另一个表来表示数据。剩下的唯一问题是询问它是Product
和Category
之间的One-to-many关系,还是many-to-many关系。 您已经确认它是多对多的,这意味着单个产品可以包含多个类别,而单个类别可以包含多个产品,因此可以回答此问题。
为了开发解决方案,您需要三个表:
Product(Name, Id, Price, Location...)
ProductCategory(ProductID, CategoryID)
Category(Name, Id...)
主键中两个表中的Id
字段。这仍然是BCNF,因为Product
和Category
表中的所有属性都依赖于Id
关键字段和A 3NF table which does not have multiple overlapping candidate keys is guaranteed to be in BCNF.。 ProductCategory
表中的主键是ProductID
和CategoryID
的组合键。您不需要Products
表中提及类别的函数依赖项,以便您实现BCNF;实际上,你可能不应该这样做,因为在这种情况下这两个实体在逻辑上是不同的。
答案 1 :(得分:0)
您在产品和类别之间存在多对多关系。您想引入一个中间联结表来将其解析为两个1-many关系。
(我有附图显示,但目前图片上传已被破坏。)