行数减少,列数减少

时间:2015-10-28 19:36:59

标签: postgresql postgresql-performance

我目前正在为PostgreSQL建模一个表模式,它有很多列,并且打算包含很多行。我不知道拥有更多列或将数据拆分成更多行是否更快。

架构看起来像这样(缩短):

CREATE TABLE child_table (
  PRIMARY KEY(id, position),
  id bigint REFERENCES parent_table(id) ON DELETE CASCADE,
  position integer,
  account_id bigint REFERENCES accounts(account_id) ON DELETE CASCADE,
  attribute_1 integer,
  attribute_2 integer,
  attribute_3 integer,
  -- about 60 more columns
);

最多10行child_table最多与一行parent_table相关。顺序由position中的值给出,范围从1到10. parent_table旨在容纳6.5亿行。使用此模式,我最终会在child_table中获得65亿行。

这样做很聪明吗?或者以这种方式对其进行建模更好,以便我只有6.5亿行:

CREATE TABLE child_table (
  PRIMARY KEY(id),
  id bigint,
  parent_id bigint REFERENCES other_table(id) ON DELETE CASCADE,
  account_id_1 bigint REFERENCES accounts(account_id) ON DELETE CASCADE,
  attribute_1_1 integer,
  attribute_1_2 integer,
  attribute_1_3 integer,
  account_id_2 bigint REFERENCES accounts(account_id) ON DELETE CASCADE,
  attribute_2_1 integer,
  attribute_2_2 integer,
  attribute_2_3 integer,
  -- [...]
);

1 个答案:

答案 0 :(得分:2)

列数和行数少于how well they are indexed。索引大大减少了需要搜索的行数。在索引良好的表中,总行数无关紧要。如果你试图将10行粉碎成一行,你将使索引变得更加困难。它还将使编写高效查询更加难以使用这些索引。

Postgres many different types of indexes涵盖了许多不同类型的数据和搜索。你甚至可以自己编写(虽然这不是必需的)。

  

最多10行child_table最多与一行parent_table相关。

避免在架构中编码业务逻辑。业务逻辑一直在变化,尤其是任意数字,如10。

您可以考虑的一件事是减少属性列的数量,60是很多,尤其是如果它们实际上被命名为attribute_1attribute_2等等。相反,如果您的属性定义不明确,请将它们存储为具有键和值的单个JSON column。 Postgres的JSON操作非常有效(假设您使用jsonb类型)并在键/值存储和关系数据库之间提供了良好的中间地带。

同样,如果任何属性集都是简单列表(例如address1address2address3),您还可以考虑使用Postgres arrays

如果没有具体细节,我无法给出更好的建议。