在数据库中的两个位置之间存储路由

时间:2011-09-11 17:02:11

标签: mysql database database-design

有人可以告诉我,如何设计可以存储的数据库

  • 起始位置(城市名称)
  • 之间的位置(城市名称b / w起始位置和结束 位置,db应该能够处理任意数量的地方)
  • 结束地点(城市名称)

谢谢!

修改 enter image description here

例如,我必须保存芝加哥和纽约之间的地方。 我不知道如何设计一个可以保持的数据库

  • 首发地点(芝加哥)
  • 介于两者之间(Iam主要对这里的数据类型感到困惑)
  • 结局(纽约)

3 个答案:

答案 0 :(得分:2)

我有三张桌子:位置,路线和停靠点

locations:
    location_id | name

routes:
    route_id | description

stops:
    stop_id | location_id (fk) | route_id (fk) | stop_number

停止表是交联表。在插入位置时,让应用程序设置正确的停止编号。 然后,您可以通过简单的

获取路线
select * from routes join stops join location
where route_id = ...    
order by stop_number

如果您需要在路线中插入位置,请使用两个查询:

update stops set stop_number = stop_number + 1 
where route_id = ... 
   and stop_number > 'inserted_stop_number';

insert into stops (route_id, location_id, stop_number) values // etc

理论上,链接列表(存储对路径下一站的引用)在概念上更接近现实,但在标准的Mysql选项中,非常很难获得列表从这种方式存储的数据,所以我会建议反对它,并为自己保持简单。

如果你真的需要更多的权力来创建和使用路由中的链接节点,你可以考虑学习:http://openquery.com/graph/doc但是对于简单的从头到尾的路线不需要一直重新计算,上述内容很可能就足够了。

答案 1 :(得分:1)

您应该有另一个可以引用的表,它与所有开始,传输和完成记录具有一对多的关系,因此您可以将整个“集合”记录“绑定”在一起。 / p>

trip_id | ...

位置

location_id | trip_id | location_type | location

location_type列中,您可以使用一些独特的标记来告诉您位置记录是否表示开始运输完成。例如,start可能是0的标志,1可能是过境的标志,而2可能是结束的标志。

答案 2 :(得分:1)

未测试

CREATE TABLE Location (
    ID INT UNSIGNED AUTO_INCREMENT,
    Name VARCHAR(50),
    PRIMARY KEY (ID)
) ENGINE=INNODB CHARACTER SET utf8

CREATE TABLE Trip (
    ID INT UNSIGNED AUTO_INCREMENT,
    Name VARCHAR(50),
    StartLocation INT UNSIGNED,
    EndLocation INT UNSIGNED,
    PRIMARY KEY (ID),
    CONSTRAINT Constr_Trip_StartLocation_fk
        FOREIGN KEY Trip_StartLocation_fk (StartLocation)
        REFERENCES Location (ID),
    CONSTRAINT Constr_Trip_EndLocation_fk
        FOREIGN KEY Trip_EndLocation_fk (EndLocation)
        REFERENCES Location (ID)
) ENGINE=INNODB CHARACTER SET utf8

CREATE TABLE TripStopoff (
    Trip INT UNSIGNED,
    StopoffNumber INT UNSIGNED,
    Location INT UNSIGNED,
    PRIMARY KEY (Trip, StopoffNumber),
    CONSTRAINT Constr_TripStopoff_Trip_fk
        FOREIGN KEY TripStopoff_Trip_fk (Trip)
        REFERENCES Trip (ID),
    CONSTRAINT Constr_TripStopoff_Location_fk
        FOREIGN KEY TripStopoff_Location_fk (Location)
        REFERENCES Location (ID)
) ENGINE=INNODB CHARACTER SET ascii

INSERT INTO
    Location
    (ID, Name)
VALUES
    (1, 'Chicago'),
    (2, 'Manoning'),
    (3, 'Jersey City'),
    (4, 'Newark'),
    (5, 'New York')

INSERT INTO
    Trip
    (ID, Name, StartLocation, EndLocation)
VALUES
    (1, 'My trip', 1, 5)

INSERT INTO
    TripStopoff
    (Trip, StopoffNumber, Location)
VALUES
    (1, 1, 2),
    (1, 2, 3),
    (1, 3, 4)