我目前正在为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,
-- [...]
);
答案 0 :(得分:2)
列数和行数少于how well they are indexed。索引大大减少了需要搜索的行数。在索引良好的表中,总行数无关紧要。如果你试图将10行粉碎成一行,你将使索引变得更加困难。它还将使编写高效查询更加难以使用这些索引。
Postgres many different types of indexes涵盖了许多不同类型的数据和搜索。你甚至可以自己编写(虽然这不是必需的)。
最多10行child_table最多与一行parent_table相关。
避免在架构中编码业务逻辑。业务逻辑一直在变化,尤其是任意数字,如10。
您可以考虑的一件事是减少属性列的数量,60是很多,尤其是如果它们实际上被命名为attribute_1
,attribute_2
等等。相反,如果您的属性定义不明确,请将它们存储为具有键和值的单个JSON column。 Postgres的JSON操作非常有效(假设您使用jsonb
类型)并在键/值存储和关系数据库之间提供了良好的中间地带。
同样,如果任何属性集都是简单列表(例如address1
,address2
,address3
),您还可以考虑使用Postgres arrays。
如果没有具体细节,我无法给出更好的建议。