我有下表(PostgreSQL 8.3),其中存储了一些产品的价格。价格与另一个数据库同步,基本上下面的大多数字段(除了一个)都不是由我们的客户更新 - 而是每隔一段时间删除和刷新一次以与另一个股票数据库同步:
CREATE TABLE product_pricebands (
template_sku varchar(20) NOT NULL,
colourid integer REFERENCES colour (colourid) ON DELETE CASCADE,
currencyid integer NOT NULL REFERENCES currency (currencyid) ON DELETE CASCADE,
siteid integer NOT NULL REFERENCES site (siteid) ON DELETE CASCADE,
master_price numeric(10,2),
my_custom_field boolean,
UNIQUE (template_sku, siteid, currencyid, colourid)
);
在同步时,我基本上删除了上面的大部分数据,除了数据 WHERE my_custom_field 为 TRUE (如果它是 TRUE,这意味着客户端通过他们的 CMS 更新了这个字段,因此这个记录不应该被删除)。然后我在表中插入 100 到 1000 行,并在插入失败的地方更新(即 (template_sku、siteid、currencyid、 colourid) 的组合已经存在的地方)。
我的问题是 - 这里应该应用什么最佳实践来创建主键?甚至需要主键吗?我想让主键 = (template_sku, siteid, currencyid, colourid) - 但是 colourid 字段可以为 NULL,并且在复合主键中使用它是不可能的。
从我在其他论坛帖子上看到的内容来看,我认为我已经正确地完成了上述操作,只需要澄清一下:
1)我是否应该使用“串行”主键以防万一我需要一个?目前我没有,也不认为我会,因为表中的重要数据是价格和我的自定义字段,仅由 (template_sku, siteid, currencyid, colourid) 组合标识。
2) 由于 (template_sku, siteid, currencyid, colourid) 是我将用来查询产品价格的组合,我是否应该在我的列中添加任何进一步的索引,例如“template_sku”,它是一个 varchar?还是 UNIQUE 约束已经是我的 SELECT 的一个很好的索引?