基于字段的外键更改

时间:2011-08-25 17:40:04

标签: mysql sql foreign-keys

在SQL(特别是mysql)中考虑一种情况,当我有一个名为type的枚举(名称,关系)的表和一个名为idtype的int。

然后我有另一个名为names的表,它有一个字段idname,另一个表叫做与字段idrelation的关系。

基本上,如果type == name,则idtype是idname的外键,如果是type = relation,则idtype是idrelation的外键。有没有办法指定这样的外键关系?或者是否有一种更好,更传统的方式来表示mysql中的这种关系?

谢谢, 大卫

3 个答案:

答案 0 :(得分:2)

问题在于,您将两种不同类型的信息存储在一个表中 - 几乎总是一个坏主意(IMO)。你应该将你的第一张桌子分成两张。另一个选择是有两个字段nameID和typeID - 但我不建议这样做。如果没有更多细节,我无法提供更具体的答案。

答案 1 :(得分: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模型,以及为什么要避免它。我不知道你是否正在使用这种模式,但似乎你可能会这样。

答案 2 :(得分:1)

这听起来像是一种在实践中或在典型用户负载下无法正常工作的设计。你真的,真的需要阅读为什么EAV表是一个非常糟糕的设计选择。 EAV的灵活性是在开发时间内以非常高的成本购买的,以编写冗长,复杂,可怕的查询并且以严重降低的性能为代价。对于客户非常少数的自定义,EAV应该极少使用。但是如果你在设计中正确地完成了你的工作,那么应该对95%或更多的工作进行关系建模。

但如果你真的坚持这一点,那么你真正强制执行FK关系的唯一方法就是通过触发器。不执行它们是一个更糟糕的想法,并将导致数据损坏。