表设计用于存储大量行

时间:2010-05-10 10:12:14

标签: database-design postgresql

我正在尝试在postgresql数据库中存储一些唯一标识符以及它们已被显示的网站。我无法确定选择以下3个选项中的哪一个以便更快更容易维护。该表必须提供以下信息:

  • 唯一标识符,不幸的是它是文本
  • 已查看该唯一标识符的网站

必须保留的数据量相当大:我知道有大约2200万个唯一标识符。

所以我想到了桌子的以下设计:

  • id - 整数

    标识符 - 文本

    seen_on_site - 站点表的整数,外键

这种方法需要大约22密耳乘以站点数量。

  • id - 整数

    标识符 - 文本

    seen_on_site_1 - 布尔值

    seen_on_site_2 - boolean

    ............

    seen_on_site_n - 布尔

希望站点的数量不会超过10.这只需要我知道的唯一标识符的数量,即大约2千万,但是从ORM的角度来看,这将很难使用它。

  • 一个只存储唯一标识符的表,如:

id - 整数

unique_identifier - text,

一个只存储网站的表格,例如:

id - 整数

网站 - 文字

和一对多关系,如:

id - 整数,

unique_id - 整数(fk到存储标识符的表)

site_id - 整数(fk到站点表)

  • 另一种方法是拥有一个存储每个站点的唯一标识符的表

那么,从长远来看,哪一个似乎是更好的方法呢?

3 个答案:

答案 0 :(得分:1)

有两张桌子 表格1 网站ID,网站名称,网站描述
网站ID - >主键
网站名称 - >指数

表2将是您正在谈论的那个 行ID,站点ID,无论何种信息 行ID - >主键
网站ID - >外键入表1 索引(行ID,站点ID)

答案 1 :(得分:1)

如果您已经有一个基于文本的自然唯一标识符(url,也许?),那么您唯一需要的是一个包含两个字段的表:

CREATE TABLE (
    unique_identifier TEXT NOT NULL,
    site_identifier TEXT NOT NULL,
    PRIMARY KEY (unique_identifier, site_identifier)
);

然后,您还可以在(site_identifier,unique_identifier)上添加UNIQUE INDEX,以方便网站查找。

你最终可能会以这种方式为主表使用一些额外的空间,但查询,更新和维护都很简单。

答案 2 :(得分:0)

如果我是你,我肯定会避免十列布尔恐怖,因为以后会有更多的网站。我同意Romain Hippeau的意见,并补充说你可能希望网站上的索引能够回答诸如“谁访问过网站x?”等问题。