PostgreSQL 简单键与复合键

Posted

技术标签:

【中文标题】PostgreSQL 简单键与复合键【英文标题】:PostgreSQL simple key vs composite key 【发布时间】:2014-10-22 13:38:53 【问题描述】:

我们将在 PostgreSQL 中存储一些关于组织的信息(实际上这是一些实体,但我说“组织”只是为了结构清晰)。每个组织有 6 个子级别。第一级 - 部门,第二级(部门内部) - 部门等。每个部门(就像部门和其他部门一样)可以有一个唯一的名称。我们正在考虑 7 个表格,例如

表格组织

id(主键)--组织名称

表级别_1

id(主键)--organization_id(外键)--名称

表级别_2

id(主键)--level_1_id(外键)--名称

我们假设在低级别(2-6)上,每个级别可以有数千个 ob 对象。 问题是我们应该如何构造主键——作为简单键(如上所述)或复合键。 F.i.

表级别_1

id(主键)--organization_id(主键)--名称

表级别_2

id(主键)--level_1_id(主键)--名称

哪种键类型更好(首先,对于 SELECT 查询更快),为什么? 谢谢。

【问题讨论】:

您计划进行什么样的查询? 'cos ... for SELECT queries 的范围定义太宽泛了?您是否需要查询完整的层次结构? 它可以是各种查询:选择所有组织,选择某个组织中的所有部门,选择某个组织的某个部门中的所有部分等。所以是的,我们正在计划针对完整层次结构的查询。 【参考方案1】:

恕我直言,这是一个糟糕的设计。

如果您需要添加关卡,您会怎么做?

您需要添加一个表格 您需要修改所有代码、视图...

不是很可扩展...

你应该只有一张桌子。

Organizations
Id   Parent_Id    Name

数据样本:

1    NULL         Corporation
2       1         Division_1
3       1         Division_2
4       2         Dept_1_of_Division_1
5       2         Dept_2_of_Division_1
6       3         Dept_1_of_Division_2

要查询此表,您需要使用WITH RECURSIVE

【讨论】:

谢谢。我同意,但有一些问题: 1) 我们预计不会有新的水平。新级别只能在最低级别之后出现(如果出现),因此创建具有父级别外键的新表并不困难。所以没有代码修改。 2)你的想法会导致很多副本。菲org_name 将为每个部门、每个部门等保存。假设我们有 1000 个部门和每个部门 1000 个部门。所以我们有 1000*1000 个 org_name 副本。低级对象也是如此。这就是我不想将所有数据存储在一张表中的原因。 1) =) 2) 你能解释一下吗?看来我没有你的想法。如果我只有一张桌子,我需要在那里保存所有级别。 org_name 对应其部门、部门等。 谢谢。需要考虑一下。 @user2498776 您的“大量副本”表明您不了解关系 DBMS 的工作原理。表用于具有特定列组合的事实。如果一个值出现在另一个表中,那就是记录另一个事实。规范化是(主要)减少冗余的方法。它用较小的桌子代替了一张大桌子。然而,那些较小的表共享列和其中的值!此外,如果这是您的理解水平,那么在您了解有关简单架构设计的更多信息之前,您不必担心“更快”。

以上是关于PostgreSQL 简单键与复合键的主要内容,如果未能解决你的问题,请参考以下文章

mysql的联合主键与复合主键区别

Postgres:如何做复合键?

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

如何在房间中制作复合键

PostgreSQL中复合类型列子列的外键约束