Хранение маршрута между двумя местоположениями в базе данных - PullRequest
3 голосов
/ 11 сентября 2011

Может кто-нибудь сказать, пожалуйста, как спроектировать базу данных, которая может хранить

  • Исходное местоположение (название города)
  • Места между (Название города ч / б Начальное местоположение и Окончание местоположение, дБ должно быть в состоянии обрабатывать любое количество мест)
  • Конечный пункт (название города)

Спасибо!

Изменить: enter image description here

Например, я должен спасти места между Чикаго и Нью-Йорком. Я не уверен, как создать БД, которая может удерживать

  • Стартовая площадка (Чикаго)
  • мест между ними (я в основном путаюсь с типом данных здесь)
  • конечное место (Нью-Йорк)

Ответы [ 3 ]

2 голосов
/ 11 сентября 2011

У меня было бы три таблицы: местоположения, маршруты и остановки

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 голос
/ 11 сентября 2011

Непроверенные

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)
1 голос
/ 11 сентября 2011

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

поездки

trip_id | ...

местоположения

location_id | trip_id | location_type | location

В столбце location_type вы можете иметь несколько отличительных флагов, которые сообщат вам, если запись местоположения обозначает начало , транзит или финиш .Например, start может быть флагом 0, 1 может быть флагом транзита, а 2 может быть флагом финиша.

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