Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 将同一表中的行关联起来的最佳方式是什么_Django_Postgresql - Fatal编程技术网

Django 将同一表中的行关联起来的最佳方式是什么

Django 将同一表中的行关联起来的最佳方式是什么,django,postgresql,Django,Postgresql,我试图设计一个行表,每一行可以以某种方式与另一行关联 在实践层面上,我们讨论的是土层(考古学) 一行-一层-在另一层之上,本质上A在B之上,C在C之上,同样C在B之下,B在A之下。在图形数据库中,这将是非常琐碎的,不幸的是,我们使用的是关系数据库。每个关系都有一个方向,a在B之上,但B不在a之上。数据将被添加为a在B之上,尽管我们可能希望搜索并找到B之上的内容,无论是否明确该关系,如果a在B之上,那么B必须在a之下。更复杂的是,D可以等于E,因为它与,所以D=E和E=D,但是这不是方向性的,因为

我试图设计一个行表,每一行可以以某种方式与另一行关联

在实践层面上,我们讨论的是土层(考古学)

一行-一层-在另一层之上,本质上A在B之上,C在C之上,同样C在B之下,B在A之下。在图形数据库中,这将是非常琐碎的,不幸的是,我们使用的是关系数据库。每个关系都有一个方向,a在B之上,但B不在a之上。数据将被添加为a在B之上,尽管我们可能希望搜索并找到B之上的内容,无论是否明确该关系,如果a在B之上,那么B必须在a之下。更复杂的是,D可以等于E,因为它与,所以D=E和E=D,但是这不是方向性的,因为两者的关系都是正确的

这就是逻辑

但是,设计一些表来实现这一点的最佳方法是什么?我应该注意到我们使用PostgreSQL和Django

下面是一个基本示例

Table name: Layer
id
Layer_name
我想我们需要第二张表,如下所示:

Table name: Relationship
id
layer_id1
relationship
layer_id2
如前所述,我还看到了对非定向关系的引用

我提到我们使用的是Django,前端可以/应该执行任何消毒或技巧,比如if语句,如果A高于B,那么输入B也低于A,如果A=B或B=A只输入A等于B


欢迎提供任何建设性建议。

尽管在PostgreSQL中可以将层表示为图形(或使用连接表的多对多关系),但这样做会导致运行比较非相邻层的查询的成本高昂,因为您需要进行多个连接来遍历关系序列

为土层添加一个列可能更简单,它允许您对土层进行排序并进行比较

建模的最简单方法是引入数字列。您可以将此列视为一个允许您垂直排列图层的数字

这个专栏看起来像

level double precision NOT NULL
第一层可以设置为任意起始值,例如
level=0.0

如果在所有其他图层的上方或下方添加图层,则其
级别将比最大值多1或比最小值少1

要在两个现有层之间添加层,请将其
级别设置为相邻层的算术平均值。例如,要在标高2.0的图层和标高3.0的图层之间添加图层,请将新图层标高设置为2.5


要查询相邻层,您可以根据级别值的差异进行排序,下面是负差异,上面是正差异。

正如Iain Shelvington所提到的,对于您的情况,最好的方法似乎是Django的自参考非对称:

然后,您可以创建图层并对其进行排序:

D = SoilLayer.objects.create(name="D")
C = SoilLayer.objects.create(name="C")
B = SoilLayer.objects.create(name="B")
B.lower_layers.add(C, D)
A = SoilLayer.objects.create(name="A")
A.lower_layers.add(B)
最后,您可以搜索它们:

A.lower_layers.all();    #returns B
B.lower_layers.all();    #returns C and D
C.upper_layers.all();    #returns B
D.upper_layers.all();    #returns B

您希望如何输入数据?即使不是唯一的,表中一列带有“level”也就足够了?虽然在关系数据模型定义中不需要方向性,但它可以在数据实体和关系定义中强制执行,也可以在数据实体和关系定义中强制执行,或者在用于检索它的查询中强制执行。您熟悉外部联接吗?首先,请参见两个层都必须位于层表中(因此考虑引用语法),只有这样,它才能与另一个预先存在的层相关。我以前使用过外部联接。如果使用Django模型,则非对称自引用ManyToManyField会起作用。level值的问题是它不能保持结构中的level之间的关系。假设A(1级)高于B(2级),A’(质数)(1级)高于B’(2级)与A到B无关。也许A-B在美国西北太平洋,A'-B'在南非。您需要一个图(M:M)或层次结构(1:M)来保持直线。那就取决于答案了A和C都能在B上面吗?B能高于D和E吗?这是有效的批评。但OP并没有描述这些限制。我将等待裁决,也许这个简单的模型可以在更小的区域工作就足够了。同意,我只是想让OP意识到它的局限性。而且描述有点缺乏。
A.lower_layers.all();    #returns B
B.lower_layers.all();    #returns C and D
C.upper_layers.all();    #returns B
D.upper_layers.all();    #returns B