Структура данных, сохраняющая порядок элементов ManyToMany - PullRequest
0 голосов
/ 14 февраля 2020

Например,

Есть две линии и несколько станций.

Line X 
Station A - Station B - Station C - Station D

Line Y
Station E - Station F - Station B - Station G

Линия X и Y пересекаются на Станции B

Так что мои таблицы похожи это ниже

Таблица строк

1 X  "LineX"
2 Y  "LineY" 

Таблица станций

1 A X
2 B X,Y
3 C X
4 D X
5 E Y
6 F Y
7 G Y

Модели похожи на это (Это django, но использование doctrine почти одинаково.)

class Line(models.Model):
    name = models.CharField(unique=True,max_length=255)
    def __str__(self):
        return self.name

class Station(models.Model):
    name = models.CharField(unique=True,max_length=255)
    lines = models.ManyToManyField(Line)
    def __str__(self):
        return self.name

В этом случае вы можете легко получить станции LineX.

SELECT from station table where line (which include) Y

return A,B,C,D

Однако для LineY

возвращает B, E, F, G

, но B - не вершина.

Это третья станция.

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

Как лучше всего структурировать, сохраняя порядок множества предметов? ?

Я знаком с моделями Doctorine2 и django.

Буду признателен за любую помощь с вашей стороны.

1 Ответ

1 голос
/ 14 февраля 2020

Предупреждение: этот ответ учитывает структуру данных только в БД и не относится к django.

Возможно, вы могли бы реализовать таблицу Line_Order с внешними ключами для линии и станций. У меня также был бы тег направления (поскольку я предполагаю, что ваши линии двунаправленные, а не круглые)

Например,

    Line_id    Station_id    Direction
1   1          1             Line X Eastbound
2   1          2             Line X Eastbound
...
5   1          4             Line X Westbound
...
10  2          5             Line Y Northbound
11  2          6             Line Y Northbound
12  2          2             Line Y Northbound
13  2          7             Line Y Northbound
...

А потом, если честно, я бы отбросил линию столбец полностью из таблицы станций.

Приведенная выше структура является хрупкой для изменений. Если ваши железнодорожные линии, вероятно, будут изменены, то вы можете вместо sh рассмотреть таблицу «Следующая станция», аналогичную связанному списку. Ваша таблица может перечислить line_id, station_id, следующий station_id и предыдущий station_id. Направление движения может или не может потребоваться в зависимости от вашей реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...