【发布时间】:2012-05-18 00:02:59
【问题描述】:
我有下表(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 的一个很好的索引?
【问题讨论】:
-
colourid 可以为空。这使它成为主键的讨厌成员。
-
好的,这是简单的答案。如果您有一个表,其中列 a、b、c、d 和 d 可以为空,您可以使用具有相同 a、b 和 c 字段的行吗?如果是这样,那么您所拥有的一切都很好。如果您需要将它们区分开来,那么您需要 a、b、c 上的唯一索引或 a、b、c 上的部分索引,其中 d 为空。
标签: postgresql database-design null indexing primary-key