帮助数据库设计

时间:2010-03-01 19:44:29

标签: database database-design

我有四个表:ItemCategory,Items,DiamondCategoy和Diamonds。

用户存储项目详细信息并指定是否有钻石,例如:

ItemCategory: Ring
Item: R1

如果有钻石那么:

DiamondCategory: Round
Diamond: D1

因此,戒指的R1具有圆形的D1

物品可能没有钻石,例如:

ItemCategory: Ring
Item: R1
DiamondCategory: None
Diamond: None

我无法弄清楚如何设计关系。我提出了这个解决方案,如果我错了,请纠正我。

ItemCategory:

c_Id >> PK

产品:

p_Id >> PK

c_Id >> FK

d_Id >> FK

钻石:

d_Id >> PK

dc_Id >> FK

DiamondCategory:

dc_Id >> PK

这是正确的吗?。

2 个答案:

答案 0 :(得分:2)

如果物品和钻石只能有一个类别,为什么还需要单独的表格呢?只需在您的项目和钻石表格中包含该类别作为属性。

然后你有两个表,一个用于Items,一个用于Diamond,第三个表用作两者之间的查找表,并存储Item的主键和相应钻石的主键它有。

答案 1 :(得分:1)

就我而言,这对我来说很好。如果一个物品可以有多种类型的钻石(就像许多戒指一样),你可能想要一个交叉点(交叉点)表,如下所示:

产品:

p_Id >> PK

c_Id >> FK

ItemDiamonds

d_Id >> FK  >>
            >>  UK or PK
p_id >> FK  >>

no_of_diamonds 

因此,项目ID和钻石ID是单独的外键,并且(项目ID,钻石ID)一起形成主键或唯一键。 no_of_diamonds属性假定Item可以包含多种类型的Diamond。

为每个查找代码(您的类别表)提供单独的表有两个好处:

  • 这是对适当的类别ID强制执行外键的唯一方法
  • 具有复杂优化器(如Oracle)的数据库产品可以利用更具体的表来生成更准确的执行计划。