postgreSQL表设计

时间:2013-01-24 04:58:24

标签: postgresql ddl

我需要创建一个表(postgresql 9.1),我被卡住了。你能帮忙吗?

传入的数据可以采用以下两种格式之一:

  1. 客户端ID(int),商店ID(int),asof(日期),数量
  2. 客户端ID(int),, asof(日期),数量
  3. 指定的传入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亿行。

    感谢。

2 个答案:

答案 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中提供的表继承。