我正在尝试解决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
,这样就需要vin
和vehicles
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>
答案 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)
这是一个糟糕的模型。你想要匹配,或者你不想。整个部分思想专门用于处理不良模型。如果你别无选择,可以写一个触发器。