버스 정류장 쿼리 데이터베이스 스키마를 디자인하는 방법?


9

우리는 버스 스테이션 데이터를 가지고 있으며 주어진 시작 스테이션과 끝 스테이션에 라인 / 여러 라인을 제공하는 애플리케이션을 구축하려고합니다.

예를 들어, 사용자는 station1에서 station2까지 버스 노선 제안을 받으려고 시도합니다.

모두를 커버 할 수있는 버스 라인이 있으면 station1하고 station2,이 라인은 반환해야합니다. 결과는 다음과 같습니다.

Step1: station1 -- station2

station1과 station2 사이에 직접 버스 노선이없는 경우, 애플리케이션은 교환 계획을 찾으려고 시도해야합니다. 예를 들어 결과는 다음과 같습니다.

Step1: station1 -- exchangestation

Step2: exchangestation -- station2

이제 데이터가 있지만 데이터베이스에서 데이터 모델을 디자인하는 방법, 쿼리를 효율적으로 만들기 위해 스키마를 만드는 방법을 모르십니까?

==============================================

최신 정보:

여기에 이미지 설명을 입력하십시오

예를 들어, 각각 다른 색상의 버스 라인이 4 개 있습니다 (실제로는 2 개).

l1: A-B-C-D
l2: D-B-A (in fact, the l2 is the reverse of l1 except the l2 will skip station `C`.
l3: E-B-D-F
l4: F-D-B-E(reverse of l3) 

주어진 스테이션에 대한 버스 라인 계획을 쿼리하기 위해 이러한 정보를 데이터베이스에 저장하려면 필요한 테이블 수와 각 테이블에 무엇을 넣어야합니까?


@ giser.i도 비슷한 문제가 있습니다. gis.stackexchange.com/questions/70253/…
scott 님이

답변:


6

모든 경로를 다른 경로의 조합으로 정의하는 다른 테이블을 작성해야한다고 생각합니다. 그런 다음이 테이블을 쿼리하고 실제 경로에 조인하여 형상을 얻습니다.

쿼리가 '국에서'에서 '국으로'에 대한 것이며 각 섹션에 '국에서 및 역으로'가 있습니다. 그러나 여러 섹션을 취하는 경로를 포함하려면 다음과 같은 다른 테이블 '라우트'를 가질 수 있습니다.

  • '경로 이름', '경로 ID', '역에서', '역으로'

원본 섹션 테이블도 필요합니다.

  • '섹션 이름', '섹션 ID'등

그리고 다음과 같은 다른 조인 테이블이 필요하다고 생각합니다.

  • '경로 ID', '섹션 ID'

해당 테이블은 라우트와 섹션 테이블 사이의 일대 다 관계를 저장하므로 위의 예에서는 조인 테이블에 각 단계마다 하나씩 두 개의 행이 있습니다. 라우트 테이블에서 출발 및 도착 역에 대한 쿼리가 수행됩니다. 공간 인 경우 리턴 된 데이터는 라우팅 테이블의 세부 사항이고 섹션 테이블의 공간 데이터입니다. 어쩌면 각 섹션이나 다른 것에서 시간을 더할 수도 있습니다.

말이 돼?


실제로, 우리는 지금 테이블이없고, 텍스트 형식 인 원본 데이터 만 가지고 있습니다.
giser

그래, 괜찮아 나는 내 대답이 선다고 생각합니다. 세 개의 테이블을 사용하겠습니다.
Alex Leith

라이브 예를 사용하여 게시물을 업데이트합니다. 시간을내어 확인해야합니까?
giser

@ AlexLeith.i도 비슷한 문제가 있습니다 gis.stackexchange.com/questions/70253/…
scott

3

아마도 해당 도구를 선택하고 도구가 강제하는 스키마를 따라야합니다 (예 : pgRouting ).

테이블없이 수행하려면 정점과 노드를 실제로 저장하기 위해 두 개의 테이블 만 있으면됩니다.

트릭은 이미지에 공간적 접근 방식을 보여 주지만 실제로는 일시적인 접근 방식이 필요합니다 (이미지 보류 중). 버스는 노드 A에서 노드 B로 이동하지 않습니다. 버스는 노드 A @ 12 : 00 에서 노드 B @ 12 : 10으로 이동 합니다.

그래서 우리는 모든 역에 대한 노드 + 각 역에서 출발하는 모든 시간에 대한 노드를 만듭니다. 각 노드에는 3 개의 단방향 링크가 있습니다.

  • 버스 목적지 링크 (A @ 12 : 00-B @ 12 : 10 비용 : 10 분)
  • 이 역에서 출발하는 다음 버스로 연결 (A @ 12 : 00-A @ 12 : 30 비용 : 30 분)
  • 기본 노드에 연결 (A @ 12 : 00-A 비용 : 0 분)

이제 지점 A에서 지점 C 로의 연결을 찾기 위해 스테이션 A에서 가장 빠른 일치 지점을 선택하고 거기서부터 스테이션 C의 기본 노드로가는 길을 찾습니다.

노드 :

id|station|time
---------------
1 |A      |NULL
2 |B      |NULL
3 |A      |12:00
4 |B      |12:10

정점

id|start_node|end_node|line|cost
---------------------------
1 |3         |4       |l1  |10
2 |3         |1       |NULL|0
3 |4         |2       |NULL|0

.i 또한 비슷한 문제가 있습니다 gis.stackexchange.com/questions/70253/…
scott

0

다음은 OpenStreetMap의 Javascript 및 데이터를 사용 하는 실제 예제 입니다. 데이터 모델이 유용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.