Postgresql MATCH PARTIAL可以解决吗?

时间:2010-08-10 20:12:15

标签: sql postgresql foreign-keys foreign-key-relationship

我正在尝试解决Postgresql 8.4缺少MATCH PARTIAL的问题。我有以下架构:

[vehicles]
lot_id | vin | source | year | make | model ...
  primary key ( lot_id, vin, source )

[pictures]
picture_id | lot_id | vin | url | sha1 ...
  primary key ( picture_id )

现在,我想要的是FOREIGN KEY REFERENCES vehicles表的复合lot_id,这样就需要vinvehicles pictures表上的MATCH PARTIAL表或完整性约束失败。问题是此功能仅在automated_make中可用,但未实现。有没有其他方法可以轻松获得这种效果?在当前架构迭代之前,我的vehicle表将为每个源override_make vin_decode_make MATCH PARTIAL提供列,这会变得一团糟。但是,看来没有indexes我将不得不做出比我原先预期更大的改变。

我想我必须保留两个复合[index] lot_id, vin primary key ( lot_id vin ) 来实现这一目标。

[vehicles]

可能会在此过程中将[sources]重命名为[vehicles];并且,然后强制[pictures]MATCH FULL PRIMARY KEY对这些过多的表格{{1}}。{/ p>

3 个答案:

答案 0 :(得分:1)

你遇到了这个问题,因为你的数据模型不好。

vehicle应由vin(车辆识别码)唯一标识。车辆的身份不会根据它的数量而改变。它的图片不太可能根据它所在的地方而改变(除非你关心,例如“Lot 4中的奥迪图片”)

所以图片应该是外键(vin),而不是车辆和批次。

现在,车辆可以 in 很多,也许对于你的车型,它必须很多。所以添加一个批次表,给车辆一个FK。

咬紧牙关并改变模型,而不是浪费时间试图容纳这个糟糕的模型。

答案 1 :(得分:0)

我同意你的想法,车辆不仅仅是由vin定义,而是vin和lot的组合,因为这不是实体车辆。我个人会从主键中删除源,并将源特定数据分解为自己的表。所以我们有:


[vehicles]
lot_id | vin
  primary key ( lot_id, vin )

[vehicle_data]
lot_id | vin | source | year | make | model ...
  primary key ( lot_id, vin, source )
  foreign key ( lot_id, vin ) references vehicles

[pictures]
picture_id | lot_id | vin | url | sha1 ...
  primary key ( picture_id )
  foreign key ( lot_id, vin ) references vehicles

即使您手动覆盖部分说明,它仍然是同一车辆。

答案 2 :(得分:0)

这是一个糟糕的模型。你想要匹配,或者你不想。整个部分思想专门用于处理不良模型。如果你别无选择,可以写一个触发器。