Я провел некоторое исследование и обнаружил, что должен хранить маршрут как последовательность остановок. Что-то вроде:
Start -> Stop A -> Stop B -> Stop C -> End
Я создал три таблицы:
- Маршруты
- Остановки
- RouteStops
... где RouteStops - это соединительная таблица.
У меня есть что-то вроде:
Маршруты
+---------+
| routeId |
+---------+
| 1 |
+---------+
| 2 |
+---------+
станций
+-----------+------+
| stationId | Name |
+-----------+------+
| 1 | A |
+-----------+------+
| 2 | B |
+-----------+------+
| 3 | C |
+-----------+------+
| 4 | D |
+-----------+------+
RouteStations
+-------------+---------------+
| routeId(fk) | stationId(fk) |
+-------------+---------------+
| 1 | A |
+-------------+---------------+
| 1 | C |
+-------------+---------------+
| 1 | D |
+-------------+---------------+
| 2 | A |
+-------------+---------------+
| 2 | D |
+-------------+---------------+
Маршрут 1 проходит
Station A -> Station C -> Station D
Маршрут 2 проходит
Station A -> Station D
Это хороший способ хранить маршруты?
Согласно Википедии :
[...] система баз данных не гарантирует какого-либо упорядочения строк, если не указано
ORDER BY
условие [...]
Могу ли я положиться на такую схему базы данных или, может быть, это нужно сделать по-другому?
На самом деле это мой университетский проект, поэтому мне просто интересно, можно ли считать такую схему правильной. В этом случае я бы, вероятно, сохранил только несколько маршрутов (около 3-5) и станций (около 10-15), каждый маршрут будет состоять из около 5 станций. Я также был бы рад услышать, как это должно выглядеть в случае реальной и большой автобусной компании.
источник
Ответы:
Для всего бизнес-анализа, ведущего к архитектуре базы данных, я рекомендую написать правила:
1-е и 2-е правила, как вы заметили, подразумевают взаимосвязь «многие ко многим», поэтому вы правильно сделали, что создали routeStation.
Третье правило интересное. Это означает, что для соответствия требованиям необходим дополнительный столбец. Куда это должно идти? Мы видим, что это свойство зависит от маршрута и станции. Поэтому он должен быть расположен в routeStations.
Я бы добавил столбец в таблицу routeStations под названием "stationOrder".
Тогда запрос становится простым:
Примечания:
Для разработки на ноте 3 я создал вариант использования:
Это Oracle 12c Enterprise.
Обратите внимание, что в плане выполнения ниже эта таблица маршрутов вообще не используется. Оптимизатор базовых затрат (CBO) знает, что он может получить routeId непосредственно из первичного ключа routeStations (шаг 5, СКАНДИРОВАНИЕ ДИАПАЗОНА ИНДЕКСА на ROUTESTATIONS_PK, Информация о предикате 5 - доступ («RS». «ROUTEID» = 1))
Теперь самое интересное, давайте добавим имя столбца в таблицу маршрутов. Теперь есть столбец, который нам действительно нужен в «маршрутах». CBO использует индекс, чтобы найти rowID для маршрута 1, затем обращается к таблице (доступ к таблице по индексу rowid) и захватывает столбец "rout.name".
источник
Вы правы, в реляционной таблице нет внутреннего порядка записей. Это означает, что вам нужно предоставить какой-то явный способ заказа станций внутри каждого маршрута.
В зависимости от того, как вы планируете получить доступ к данным, вы можете
sequenceNumber
столбец, чтобыRouteStations
сохранить последовательность каждой станции на каждом маршруте.nextStationId
столбец для хранения «указателя» на следующую станцию в каждом маршруте.источник
Я не видел, чтобы кто-то что-то говорил об этом, поэтому я решил добавить к вашей оценке. Я бы также поместил некластеризованный уникальный индекс (в зависимости от вашей СУБД) в таблицу RouteStations / RouteStops во всех трех столбцах. Таким образом, вы не сможете совершать ошибки, и автобус будет ехать до двух следующих станций. Это усложнит обновление, но я думаю, что все равно это следует рассматривать как часть хорошего дизайна.
источник
Я говорю как прикладной программист :
Даже не думайте о маршрутизации или расписании запросов к базе данных (или в хранимых процессах), это никогда не будет достаточно быстрым. ( Если только это не проблема «домашней работы». )
Даже для приложения, которое обрабатывает данные в памяти, загрузка данных из базы данных никогда не будет быстрой, если все данные не загружаются при запуске или данные хранятся в деморализованной форме. Как только данные деморализованы, нет смысла использовать реляционную базу данных.
Поэтому я считаю, что база данных является «основной» копией данных, и я согласен с тем, что мне также придется хранить ее предварительно обработанной в памяти приложения или на сервере кэширования, таком как мембрана.
Ответ ndefontenay дает хороший дизайн таблицы в качестве отправной точки, но вы должны учитывать, что маршруты имеют различное время в зависимости от времени дня и часто имеют разные остановки в зависимости от времени, дня недели или даже школьных каникул.
источник