我的任务是创建一个应用程序来跟踪我们的合同。我计划使用django和postgresql。
我们现有的数据在excel中有52行。
我在文件中发现了一个层次结构模式,它包含如下内容
任职
注册办事处
运营办公室
例如,控股公司(company)可以包含一个或多个注册办事处(company),而注册办事处(company)可以包含一个或多个运营办事处(company)。
首先,我想我可以创建3个表并使用pk和fkMap它们。但是如果将来他们想将层次结构从3改为4或5,我如何设计一个数据库来实现同样的效果呢。
2条答案
按热度按时间xxls0lw81#
这通常是使用一种称为“邻接列表模型”的模式来完成的。
请注意
parent_office_id
可为空表示“无父级”。然后你可以建立这样的结构:
您可以使用递归查询获得所有“子”办公室。有很多关于stackoverflow的例子。
ttisahbt2#
这里有一些权衡——甚至有一本(非常好的)书概述了这些选择。
@没有名字的马是最常用的例子。
此模型的好处是,您不必将关系的性质硬连接到数据模型中。当你发现一个注册办事处没有控股公司,你不需要取消你的“3表”模型,以适应这一点。您可以包含一个“office类型”列,这样您的ui就可以显示office类型,而无需从关系中进行推断。
其他好处是很容易改变等级制度——注册办事处可以很容易地转移到另一家控股公司,连同它的所有子公司。
缺点是您不能轻松地在数据模型中实施业务规则。如果有一个业务规则说“所有注册办事处必须完全属于一个注册办事处”,则不能创建引用完整性约束来强制执行该规则。