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

时间:2016-11-09 19:03:35

标签: database-design associations relational-database has-and-belongs-to-many has-many

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

这是一个简单的部分:

  • 路线有很多方向
  • 停止有很多路线

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

  • 停止有很多方向

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

这是尝试图表:

 Route
 |    \
Stop — Direction

这对你来说味道不好吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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站,当公共汽车朝相反方向行驶时。

<强>更新 听起来“方向”是停止的一个属性,表示它是或可能被沿该方向行进的路线使用。这可以通过一个简单的表来建模。

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号站可用于北行,南行和西行路线。