2011-08-25 77 views
1

在SQL(特别是mysql)中考虑一种情况,当我有一个名为type的枚举(name,relation)和一个名为idtype的int的表时。基于字段的外键更改

然后我有另一个表称为名称有一个字段idname和另一个表称为与字段idrelation的关系。

本质上,如果键入== name,那么idtype是idname的外键,如果type = relation,则idtype是用于idrelation的外键。有没有办法指定这种外键关系?或者/是否有更好,更传统的方式来表示这种关系在MySQL中?

谢谢, 大卫

+2

任何时候你想这样想,这是一个迹象表明你的数据库设计是致命的缺陷。 – HLGEM

回答

2

的问题是,你存储两个differen类型的信息在一个表中 - 几乎总是一个坏主意(IMO)。你应该把你的第一张桌子分成两份。另一个选择是有两个字段nameID和typeID - 但我不会推荐这样做。没有更多的细节,我不能提供更具体的答案。

1

我通常使用类似于面向对象的说法中的继承来对此进行建模。这将是这个样子:

Products 
    id (PK) 

Widgets 
    product_id (FK to Products.id) (PK) 
    <widget specific columns> 

Whatsits 
    product_id (FK to Products.id) (PK) 

Product_Types 
    type_id 
    product_id (FK to Products.id) 

这样,你可以涉及的产品类型要么产品亚型。

您的设计听起来有点“松散goosey”,但也许这是因为你只是举一个例子。我建议找出有关EAV模型,但为什么你应该避免它。我不知道你是否使用这种模式,但似乎你可能会。

+1

也像我一样听起来像EAV。大多数情况下存储数据的最糟糕的方式。 – HLGEM

1

这听起来像是一种设计,在实践中或在典型的用户负载下将无法正常工作。你真的需要了解为什么EAV表格是一个非常糟糕的设计选择。 EAV的灵活性在开发时间以非常高的成本购买,以编写冗长,复杂,可怕的查询,代价是性能严重下降。 EAV只能极少用于客户自定义的几个。但是,如果你在设计中正确地完成了你的工作,95%或更多的应该是关系模型。但是如果你真的坚持这一点,那么真正实施FK关系的唯一方法就是通过触发器。不执行它们是一个更糟的想法,并会导致数据损坏。