我需要创建一个表(postgresql 9.1),我被卡住了。你能帮忙吗?
传入的数据可以采用以下两种格式之一:
指定的传入CSV模板为:{客户ID,商店ID,商店类型,商店类型,商品数量,数量}
在第一种情况下,关键是 - 客户ID,商店ID,asof
在第二种情况下,关键是 - 客户ID,商店类型,商店类型,以及
我尝试过类似的事情:
create table(
client_id int references...,
shop_id int references...,
shop_type int references...,
shop_genre varchar(30),
asof date,
quantity real,
primary key( client_id, shop_id, shop_type, shop_genre, asof )
);
然后我遇到了一个问题。当数据格式为1时,由于pk中的空值,插入失败。
客户端内的查询可以是商店ID,也可以是商店类型和流派的组合。在类型上没有部分或正则表达式匹配的用例。
什么是合适的设计?我必须将其拆分为2个表格然后结合搜索结果吗?或者,习惯上将0和空白用于缺失值并继续前进?
如果重要,一旦加载了所有历史数据,该表预计将为100-5亿行。
感谢。
答案 0 :(得分:3)
您可以尝试部分唯一索引,也就是过滤唯一索引,也就是条件唯一索引。 http://www.postgresql.org/docs/9.2/static/indexes-partial.html
基本上它归结为基于where子句
过滤唯一性例如(当然测试正确性和对性能的影响):
CREATE TABLE client(
pk_id SERIAL,
client_id int,
shop_id int,
shop_type int,
shop_genre varchar(30),
asof date,
quantity real,
PRIMARY KEY (pk_id)
);
CREATE UNIQUE INDEX uidx1_client
ON client
USING btree
(client_id, shop_id, asof, quantity)
WHERE client_id = 200;
CREATE UNIQUE INDEX uidx2_client
ON client
USING btree
(client_id, asof, quantity)
WHERE client_id = 500;
答案 1 :(得分:1)
一个简单的解决方案是为主键创建一个字段,该字段将使用两种算法之一根据传入的内容生成其数据。
如果您想要一个完全规范化的解决方案,您可能需要将商店信息拆分为两个单独的表,并使用外部联接从该表中引用它。
您也可以使用postgres中提供的表继承。