sql数据库设计层次结构

hi3rlvi2  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(455)

我的任务是创建一个应用程序来跟踪我们的合同。我计划使用django和postgresql。
我们现有的数据在excel中有52行。
我在文件中发现了一个层次结构模式,它包含如下内容
任职
注册办事处
运营办公室
例如,控股公司(company)可以包含一个或多个注册办事处(company),而注册办事处(company)可以包含一个或多个运营办事处(company)。
首先,我想我可以创建3个表并使用pk和fkMap它们。但是如果将来他们想将层次结构从3改为4或5,我如何设计一个数据库来实现同样的效果呢。

xxls0lw8

xxls0lw81#

这通常是使用一种称为“邻接列表模型”的模式来完成的。

create table office
(
  office_id integer primary key, 
  office_name varchar(50) not null unique,
  parent_office_id integer references office
);

请注意 parent_office_id 可为空表示“无父级”。
然后你可以建立这样的结构:

insert into office (office_id, office_name, parent_office_id)
values
(1, 'Holding Office', null),
(2, 'Registered Office One', 1),
(3, 'Registered Office Two', 1),
(4, 'Operating Office One', 2),
(5, 'Operating Office Two', 2),
(6, 'Operating Office Three', 3);

您可以使用递归查询获得所有“子”办公室。有很多关于stackoverflow的例子。

ttisahbt

ttisahbt2#

这里有一些权衡——甚至有一本(非常好的)书概述了这些选择。
@没有名字的马是最常用的例子。
此模型的好处是,您不必将关系的性质硬连接到数据模型中。当你发现一个注册办事处没有控股公司,你不需要取消你的“3表”模型,以适应这一点。您可以包含一个“office类型”列,这样您的ui就可以显示office类型,而无需从关系中进行推断。
其他好处是很容易改变等级制度——注册办事处可以很容易地转移到另一家控股公司,连同它的所有子公司。
缺点是您不能轻松地在数据模型中实施业务规则。如果有一个业务规则说“所有注册办事处必须完全属于一个注册办事处”,则不能创建引用完整性约束来强制执行该规则。

相关问题