我想知道复合主键是否是不好的做法,如果不是,在哪些情况下使用它们是有益的?
我的问题是基于这篇文章
注意关于复合主键的部分:
不良做法 6:复合主键
这是一个有争议的观点,因为现在许多数据库设计人员都在谈论使用整数 ID 自动生成的字段作为主键,而不是由两个或多个字段的组合定义的复合字段。这目前被定义为“最佳实践”,就我个人而言,我倾向于同意它。
然而,这只是一个约定,当然,DBE 允许定义复合主键,许多设计人员认为这是不可避免的。因此,与冗余一样,复合主键是一种设计决策。
但是请注意,如果您的具有复合主键的表预计有数百万行,则控制复合键的索引可能会增长到 CRUD 操作性能非常下降的程度。在这种情况下,最好使用一个简单的整数 ID 主键,其索引足够紧凑并建立必要的 DBE 约束以保持唯一性。
我有这个 SQL:
CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
INSERT INTO test(data) VALUES
('{"parent":null,"children":[2,3]}'),
('{"parent":1, "children":[4,5]}'),
('{"parent":1, "children":[]}'),
('{"parent":2, "children":[]}'),
('{"parent":2, "children":[]}');
Run Code Online (Sandbox Code Playgroud)
那会给:
id | data
----+--------------------------------------
1 | {"parent": null, "children": [2, 3]}
2 | {"parent": 1, "children": [4, 5]}
3 | {"parent": 1, "children": []}
4 | {"parent": 2, "children": []}
5 | {"parent": 2, "children": []}
Run Code Online (Sandbox Code Playgroud)
当进行正常的一对多时,它会显示如下内容:
SELECT *
FROM test x1
LEFT JOIN test x2
ON x1.id = (x2.data->>'parent')::INT;
id | data | id | …Run Code Online (Sandbox Code Playgroud)