将模型 A 与模型 B 和模型 B 的关联关联起来

Posted

技术标签:

【中文标题】将模型 A 与模型 B 和模型 B 的关联关联起来【英文标题】:Associating model A with model B AND model B's association 【发布时间】:2017-03-23 16:32:01 【问题描述】:

让我们想象一个公交系统。

下面是简单的部分:

路线有很多方向 Stop 有很多路线

但是,如果我们需要知道到达每个站点的具体路线方向怎么办?将停靠点与方向相关联是不好的做法吗?

Stop 有很多方向

请注意,现在 Stop 模型直接与 Route 模型相关联,与 Direction 模型相关联。这让我感觉很奇怪,因为 Route 模型以两种不同的方式与 Stop 模型相关联:直接关联和通过 Direction 间接关联。

这是一个图表的尝试:

 Route
 |    \
Stop — Direction

你觉得这味道难闻吗?

可以删除 Route 和 Stop 之间的关联,因为从技术上讲,我可以通过 Route->Direction(s)->Route 找到它,但在许多情况下,我们还想简单地知道哪些路线通过停止。聪明的程序员是否只选择其中一种关系?或者两者都可以接受?

【问题讨论】:

【参考方案1】:

您没有指定方向是指公共汽车在接近车站还是离开车站时的行驶方向。可以从一个方向接近拐角处或拐角附近的停靠点,然后从另一个方向离开。这在设计中无关紧要,但在根据数据构建路线时会很重要。

假设您有一个停靠点表和一个路线表。您描述的是两者之间的 m-m 关系:Route 由零个或多个 Stops 组成,Stop 可能出现在零个或多个 Routes 中。

但是,现在您想为混音添加方向。这很好,但你必须记住,“方向”是关系的一个属性。 Stop 和 Route 都不能用“方向”来描述。所以交叉表看起来像这样:

create table RouteStops(
  RouteID  int  not null references Routes( ID ),
  StopIncr smallint not null -- Stop #1, stop #2, etc.
  StopID   int  not null references Stops( ID ),
  Direction char( 2 ) not null, -- 'N', 'W', 'NW', etc
  constraint PK_RouteStops primary key( RouteID, StopIncr )
);

因此,如果 Route #15 包含 31 个站点,则此表中将有 31 个条目。

RouteID StopIncr StopID Direction
     15        1    417 N
     15        2    122 N
     15        3    213 E
     ...
     15        17   122 S
     ...

您需要一个像 StopIncr 这样的字段,以便您可以指定路线中停靠点的顺序:路线的第一站、路线的第二站等。

当公共汽车向相反方向行驶时,第 122 站将作为第三站和第 17 站访问。

更新: 听起来“方向”是 stop 的一个属性,表明它正在或可能被沿该方向的路线使用。这可以通过一个简单的表格来建模。

create table StopDirection(
  StopID    int  not null references Stops( ID ),
  Direction char( 2 ) not null, -- 'N', 'W', 'NW', etc,
  constraint PK_StopDirection( RouteID, Direction )
);

因此,停靠点可能与一个方向、两个或所有方向相关联。

StopID   Direction
    15           N
    15           S
    15           W

所以第 15 站可用于北行、南行和西行路线。

【讨论】:

感谢您周到的回答。但是方向是不同的。方向没有描述公共汽车到车站的方向。方向描述了在该站点停止的路线。例如,有时东行巴士和西行巴士停靠在同一个地方。但有时街道一侧的站点只为东行巴士,另一侧为西行。换句话说,我需要一种方法来回答这个问题:“东行A路公交车站在这里吗?”现在更清楚了吗? @emersonthis 我想是的。因此,如果一条街道向东/向西运行,并且停靠点位于街道的北侧,则它仅适用于西行巴士。 对。有时是这样,但有时不是。所以我需要模型足够灵活以适应这种情况

以上是关于将模型 A 与模型 B 和模型 B 的关联关联起来的主要内容,如果未能解决你的问题,请参考以下文章

laravel 关联查询 表一、表二、两个表的关联表

tp的关联模型

Django 模型 ManytoMany getter

ruby 助手围绕关联创建视图文本

Django Admin后台管理

数据库查询的 N + 1 问题