相关疑难解决方法(0)

复合主键是不好的做法吗?

我想知道复合主键是否是不好的做法,如果不是,在哪些情况下使用它们是有益的?

我的问题是基于这篇文章

数据库设计错误

注意关于复合主键的部分:

不良做法 6:复合主键

这是一个有争议的观点,因为现在许多数据库设计人员都在谈论使用整数 ID 自动生成的字段作为主键,而不是由两个或多个字段的组合定义的复合字段。这目前被定义为“最佳实践”,就我个人而言,我倾向于同意它。

复合主键的图像

然而,这只是一个约定,当然,DBE 允许定义复合主键,许多设计人员认为这是不可避免的。因此,与冗余一样,复合主键是一种设计决策。

但是请注意,如果您的具有复合主键的表预计有数百万行,则控制复合键的索引可能会增长到 CRUD 操作性能非常下降的程度。在这种情况下,最好使用一个简单的整数 ID 主键,其索引足够紧凑并建立必要的 DBE 约束以保持唯一性。

database-design

29
推荐指数
2
解决办法
4万
查看次数

使用 JSONB 加入 PostgreSQL

我有这个 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)

postgresql join json postgresql-9.4

24
推荐指数
1
解决办法
5万
查看次数

标签 统计

database-design ×1

join ×1

json ×1

postgresql ×1

postgresql-9.4 ×1