Как спроектировать базу данных для Laravel?

Подскажите как спроектировать базу данных станций метро?
Ниже приведена карта метро.
введите сюда описание изображения

Вобщем должен быть поиск расписания по станциям, а также должна быть возможность прокладки маршрута от начальной к конечной станции.
Не совсем понятно, в какой таблице хранить расстояние.
Есть две идеи:

  1. хранить расстояния в промежуточной таблице station_station (many to many)
  2. или хранить в таблице distances (one to many)

Первый вариант с помощью промежуточной таблицы station_station (many to many):
App\Models\Station:

id
name  
type(обычная, пересадка)  
lineName

public function distances()
{
    return $this->belongsToMany(Station::class);
}

App\Models\StationStation (many to many)

station_id
station_id2
km  (расстояние от station_id до station_id2)

И второй вариант хранить расстояние в таблице distances
App\Models\Station

id
name  
type(обычная, пересадка)  
lineName  

public function distances()
{
    return $this->hasMany(Distance::class);
}

App\Models\Distance

id  
station_id  
station_id2  
km  

Не совсем уверен как правильно, подскажите как это сделать?
Список станций будет загружаться в базу из файла.
Соседние станции будут идти одна за другой после названия линии метро:
к примеру на линии Boock будет такой список:

Boock Line (линия)  
Ajax Rapids (соседняя станция)  
HTML Heights (соседняя станция)  
JavaBeans Boulevard (соседняя станция)  
...

введите сюда описание изображения

PS
т.е. впоследствии будет алгоритм вычисления кратчайшего пути от одной станции к другой.
Но это сейчас не интересует, сейчас интересует как правильно организовать базу данных


Ответы (1 шт):

Автор решения: Daniel Protopopov

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

Поэтому вам удобнее и проще будет иметь простейшую БД с разделением на линии, станции и пересадки.

Таблица линий

ID Name
1 Booch Line
2 Gamma Line

Таблица станций

ID LineID Name 
1 1 AJAX Rapids
2 1 HTML Heights

Таблица пересадок

LineFromID LineToID StationFromID StationToID

В таблице пересадок можно записывать круговые (замкнутые) линии, где значения From/To будут идентичными.

Используя данные таблицы можно будет реализовать отношение между линиями и станциями через belongsTo/hasMany, а для пересадок (Transition) использовать модель с методами для каждой линии и станции с дополнительным методом для проверки на замыкающуюся станцию в круговой ветке:

 class Transition extends Eloquent
 {
      protected $fillable = ['line_from_id', 'line_to_id', 'station_from_id', 'station_to_id'];

       public function lineTo()
       {
            return $this->hasOne(Station::class, 'line_to_id');
       }

       public function lineFrom()
       {
            return $this->hasOne(Station::class, 'line_from_id');
       }

       public function isCircular()
       {
            return $this->station_from_id === $this->station_to_id;
       }
 }

Кстати, для сохранения расстояний можно использовать таблицу пересадок, но это уже вам вопрос на засыпку как именно ;)

→ Ссылка