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的主键,外键与唯一约束设置(点赞!!!)