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

Вобщем должен быть поиск расписания по станциям, а также должна быть возможность прокладки маршрута от начальной к конечной станции.
Не совсем понятно, в какой таблице хранить расстояние.
Есть две идеи:
- хранить расстояния в промежуточной таблице station_station (many to many)
- или хранить в таблице 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 шт):
Вы вряд ли будете просчитывать кратчайший путь напрямую через 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;
}
}
Кстати, для сохранения расстояний можно использовать таблицу пересадок, но это уже вам вопрос на засыпку как именно ;)
