PostgreSQL简单密钥与复合密钥

PostgreSQL简单密钥与复合密钥,postgresql,tree,hierarchy,composite-primary-key,Postgresql,Tree,Hierarchy,Composite Primary Key,我们将在PostgreSQL中存储一些关于组织的信息(事实上,这是一个实体,但我说“组织”只是为了清楚结构)。每个组织有6个子级别。第一级-部门,第二级(部门内部)-部门等。每个部门(就像部门和其他部门一样)可以有一个唯一的名称。我们正在考虑7张桌子,比如 表格组织 id(主键)--组织名称 表格级别_1 id(主键)--组织机构id(外键)--名称 表级_2 id(主键)--级别_1_id(外键)--名称 等 我们假设在低级别(2-6)上,每个级别可以有数千个ob对象。 问题是我们应该如何构造

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

表格组织

id(主键)--组织名称

表格级别_1

id(主键)--组织机构id(外键)--名称

表级_2

id(主键)--级别_1_id(外键)--名称

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

表格级别_1

id(主键)--组织机构id(主键)--名称

表级_2

id(主键)--级别_1_id(主键)--名称

什么键类型更好(首先,选择查询更快)以及为什么?
谢谢。

哦,这是个糟糕的设计

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

  • 您需要添加一个表
  • 您需要修改所有代码、视图
不是很容易扩展

你应该只有一张桌子

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

要查询此表,您需要使用

您计划进行哪种查询?”cos
。。。对于SELECT查询
范围的定义是否过于宽泛?您是否需要查询完整的层次结构?可以是各种查询:选择所有组织,选择某个组织中的所有部门,选择某个组织中某个部门中的所有部门等。因此,是的,我们正在计划完整层次结构的查询。谢谢。我同意,但也有一些缺点:1)我们不期望有新的水平。新级别只能在最低级别之后出现(如果出现),所以创建带有父级外键的新表并不困难。所以没有代码修改。2) 你的想法会造成很多复制品。将为每个部门、每个部门等保存F.i.组织名称。假设每个部门中有1000个部门和1000个部门。所以我们有1000*1000个组织名称副本。低级别对象也是如此。这就是为什么我不想将所有数据存储在一个表中。1)=)2)你能解释一下吗?看来我还不明白你的意思。如果我只有一个表,我需要在那里保存所有级别。组织名称对应于其部门、部门等。谢谢。需要考虑一下。@user2498776您的“大量副本”表明您不了解关系型DBMS是如何工作的。表是用于具有特定列组合的事实的。如果一个值出现在另一个表中,那就是记录另一个事实。规范化是减少冗余的(主要)方法。它用小桌子代替了一张大桌子。然而,那些较小的表共享列和列中的值!此外,如果这是您的理解水平,那么您不应该担心“更快”,直到您了解更多关于简单模式设计的知识。