【问题标题】:Data structure keeping the order of ManyToMany items保持多对多项目顺序的数据结构
【发布时间】:2020-02-14 14:02:13
【问题描述】:

例如,

有两条线和几个车站。

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 但使用学说几乎一样。)

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 模型。

如果您能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: mysql sql django database doctrine


    【解决方案1】:

    警告:此答案仅考虑数据库中的数据结构,不涉及 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
    ...
    

    老实说,我会完全从站表中删除 Line 列。

    上面的结构很容易改变。如果您的火车线路可能会被修改,那么您可能希望考虑类似于链接列表的“下一站”表。您的表格可以列出 line_id、station_id、下一个 station_id 和上一个 station_id。根据您的实施,可能需要也可能不需要行进方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2011-04-07
      • 1970-01-01
      • 2012-09-05
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多