Eu fiz algumas pesquisas e descobri que eu deveria armazenar uma rota como uma sequência de paradas. Algo como:
Start -> Stop A -> Stop B -> Stop C -> End
Eu criei três tabelas:
- Rotas
- Pára
- RouteStops
... em que RouteStops é uma tabela de junção.
Eu tenho algo como:
Rotas
+---------+
| routeId |
+---------+
| 1 |
+---------+
| 2 |
+---------+
Estações
+-----------+------+
| 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 |
+-------------+---------------+
A rota 1 passa
Station A -> Station C -> Station D
A rota 2 passa
Station A -> Station D
Essa é uma boa maneira de armazenar rotas?
De acordo com a Wikipedia :
[...] o sistema de banco de dados não garante nenhuma ordem das linhas, a menos que uma
ORDER BY
cláusula seja especificada [...]
Posso confiar nesse esquema de banco de dados ou talvez isso deva ser feito de maneira diferente?
Este é realmente o meu projeto universitário, por isso estou me perguntando se esse esquema pode ser considerado correto. Nesse caso, eu provavelmente armazenaria apenas várias rotas (aproximadamente 3-5) e estações (aproximadamente 10 a 15), cada rota consistirá em cerca de 5 estações. Eu também ficaria feliz em saber como isso deve ser, no caso de empresas de ônibus reais e grandes.
fonte
Respostas:
Para todas as análises de negócios que levam à arquitetura do banco de dados, recomendo escrever regras:
As 1ª e 2ª regras, como você notou, implicam em um relacionamento de muitos para muitos; portanto, você concluiu com razão a criação de routeStations.
A 3ª regra é interessante. Isso implica que uma coluna extra é necessária para atender ao requisito. Para onde deveria ir? Podemos ver que essa propriedade depende da rota e estação. Portanto, ele deve estar localizado em routeStations.
Eu adicionaria uma coluna à tabela routeStations chamada "stationOrder".
Então, a consulta se torna fácil:
Notas:
Para desenvolver na nota 3, criei o caso de uso:
Este é o Oracle 12c Enterprise.
Observe que, no plano de execução abaixo, as rotas da tabela não são usadas. o CBO (Cost Base Optimizer) sabe que pode obter o routeId diretamente da chave primária do routeStations (etapa 5, VERIFICAÇÃO DE INTERVALO DO ÍNDICE em ROUTESTATIONS_PK, Informações do Predicado 5 - acesso ("RS". "ROUTEID" = 1))
Agora a parte divertida, vamos adicionar um nome de coluna à tabela de rotas. Agora há uma coluna que realmente precisamos em "rotas". O CBO usa o índice para encontrar o ID da linha da rota 1, acessa a tabela (acesso à tabela pelo índice rowid) e pega a coluna "routes.name".
fonte
Você está certo, não há uma ordem inerente de registros em uma tabela relacional. Isso significa que você precisa fornecer uma maneira explícita de solicitar estações em cada rota.
Dependendo de como você planeja acessar os dados, pode
sequenceNumber
coluna paraRouteStations
armazenar, obviamente, a sequência de cada estação em cada rota.nextStationId
coluna para armazenar um "ponteiro" para a próxima estação em cada rota.fonte
Eu não vi ninguém dizer nada sobre isso, então achei que acrescentaria a sua nota. Também colocaria um índice exclusivo sem cluster (dependendo do RDBMS) na tabela RouteStations / RouteStops nas três colunas. Dessa forma, você não será capaz de cometer erros e terá o ônibus indo para 2 próximas estações. Isso tornará mais difícil as atualizações, mas acho que ainda deve ser considerado como parte de um bom design.
fonte
Estou falando como programador de aplicativos :
Nem pense em fazer roteamento ou cronograma com consultas no banco de dados (ou em um processo armazenado), nunca será rápido o suficiente. ( A menos que seja apenas um problema de "lição de casa" ) .
Mesmo para um aplicativo que processa os dados na memória que carregam os dados do banco de dados, nunca será rápido, a menos que todos os dados sejam carregados na inicialização ou os dados sejam armazenados de forma desmoralizada. Depois que os dados são desmoralizados, pouco adianta usar um banco de dados relacional.
Portanto, eu pensaria no banco de dados como sendo a cópia "principal" dos dados e aceitaria que também terei que armazená-lo pré-processado na memória do aplicativo ou em um servidor de pagamento como o membase.
A resposta de ndefontenay fornece um bom design de tabela como ponto de partida, mas você deve considerar que as rotas têm horários diferentes, dependendo da hora do dia, e geralmente têm paradas diferentes, dependendo da hora, dia da semana ou mesmo férias escolares.
fonte