Каков наилучший способ связать строки в одной таблице - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь создать таблицу строк, каждая строка может каким-то образом соотноситься с другой строкой.

На практическом уровне мы говорим о слоях почвы (археология).

Одна строка - один слой - выше другого уровня, по существу, A выше B выше C, равно C ниже B ниже A. В графической базе данных это было бы очень тривиально, к сожалению, мы используем реляционная база данных. У каждого корабля отношений есть направление, A выше B, но B не выше A. Данные будут добавлены, так как A выше B, хотя мы можем искать и находить то, что выше B, с явной или без явной информации об этих отношениях. , если A выше B, то B должно быть ниже A. Еще одним осложнением является то, что D может быть равно E, так как в нем то же самое, что и D = E и E = D, однако это не направление, поскольку соотношение истинно в обоих направлениях.

Итак, вот логика c.

Но каков наилучший способ разработки некоторых таблиц, позволяющих это сделать? Я должен отметить, что мы используем PostgreSQL и Django.

Ниже приведен базовый пример c.

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.

Любой конструктивный совет приветствуется.

Ответы [ 2 ]

1 голос
/ 16 января 2020

Несмотря на то, что в PostgreSQL можно представить слои в виде графика (или отношения «многие ко многим» с использованием таблицы соединений), из-за этого выполнение запросов, сравнивающих несмежные слои, будет дорогостоящим, поскольку нужно сделать много соединений, чтобы пересечь последовательность отношений.

Может быть проще добавить столбец для слоев почвы, который позволяет упорядочить их и сделать сравнения.

Самый простой способ к модели, которая представляет столбец цифр c. Вы можете думать об этом столбце как о количестве, позволяющем упорядочить слои по вертикали.

Столбец будет выглядеть так:

level double precision NOT NULL

Для первого слоя можно задать произвольное начальное значение, например, level = 0.0.

Если вы добавите слой выше или ниже всех остальных, его level будет на 1 больше максимального или на 1 меньше минимального.

Чтобы добавить слой между двумя существующими, установите его level в среднее арифметическое c смежных слоев. Например, чтобы добавить слой между слоем на уровне 2.0 и слоем на уровне 3.0, установите для нового уровня слоя значение 2.5.

Чтобы выполнить запрос для смежных слоев, можно отсортировать по разнице в значениях уровня с помощью отрицательные различия ниже и положительные различия выше.

0 голосов
/ 19 января 2020

Как упомянул Иэн Шелвингтон, кажется, что лучший подход для вашего случая - это Django самоссылка, несимметричная ManyToManyField :

class SoilLayer(models.Model):
    name = models.CharField(max_length=30)
    lower_layers = models.ManyToManyField(
        "self",                     #each layer can point to other layers
        symmetrical=False,          #relationships are directional (i.e. upper/lower)
        related_name="upper_layers" #look up reverse relationships easily
        )

Тогда вы можете создайте свои слои и закажите их:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...