Saya memiliki masalah ini, saya pikir Anda dapat membantu saya.
PS Saya tidak yakin bagaimana menyebutnya, jadi jika ada yang menemukan judul yang lebih tepat, silakan lakukan edit.
Latar Belakang
- Saya membuat aplikasi ini untuk mencari jalur transit bus.
- Jalur bus adalah angka 3 digit, dan unik dan tidak akan pernah berubah.
- Syaratnya adalah untuk dapat mencari baris dari halte A ke hal B.
- Antarmuka pengguna sudah berhasil mengisyaratkan pengguna untuk hanya menggunakan nama berhenti yang valid.
- Syaratnya adalah untuk dapat menampilkan jika rute memiliki jalur langsung, dan jika tidak, menampilkan kombinasi 2 baris dan bahkan 3 baris.
Contoh:
Saya perlu beralih dari titik A ke titik D. Program harus menunjukkan:
- Jika ada AD jalur langsung.
- Jika tidak, tampilkan alternatif, 2 garis kombo, seperti AC, CD.
- Jika tidak ada kombo 2 garis, cari kombo 3 baris: AB, BC, CD.
Tentu saja, aplikasi harus menampilkan nomor jalur bus, serta kapan harus berganti bus.
Apa yang saya punya:
Basis data saya disusun sebagai berikut (disederhanakan, basis data aktual mencakup lokasi dan waktu dan yang lainnya):
+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+
+-------------------------------+
| lines_stops_relationship |
+-------------+---------+-------+
| bus_line | stop_id | order |
+-------------+---------+-------+
Di mana lines_stops_relationship
menggambarkan hubungan banyak-ke-banyak antara jalur bus dan halte.
Order, menandakan urutan pemberhentian yang muncul dalam satu baris. Tidak semua baris bolak-balik, dan urutan memiliki makna (titik A dengan urutan 2 datang setelah titik B dengan urutan 1).
Masalah
- Kami mencari tahu apakah garis dapat melewati rute dengan cukup mudah. Cukup cari satu baris yang melewati kedua titik dalam urutan yang benar.
- Bagaimana saya dapat menemukan jika ada kombo 2/3 baris? Saya berpikir untuk mencari jalur yang cocok dengan sumber berhenti, dan satu untuk tujuan berhenti, dan melihat apakah saya bisa mendapatkan perhentian umum di antara mereka, di mana pengguna dapat berganti bus. Bagaimana saya ingat berhenti itu?
- 3 baris kombo bahkan lebih rumit, saya menemukan garis untuk sumber, dan garis untuk tujuan, lalu apa? Cari garis yang memiliki 2 stop, saya kira, tapi sekali lagi, Bagaimana saya ingat berhenti?
tl; dr
Bagaimana saya mengingat hasil dari kueri agar dapat menggunakannya lagi? Saya berharap untuk mencapai ini dalam satu permintaan (untuk masing-masing, permintaan untuk rute 1-line, permintaan untuk 2, dan permintaan untuk kombo 3-line).
Catatan: Saya tidak keberatan jika seseorang menyarankan pendekatan yang sama sekali berbeda dari yang saya miliki, saya terbuka untuk solusi apa pun.
Akan memberikan bantuan apa pun dengan cookie dan upvote. Terima kasih sebelumnya!
Jawaban:
Anda mungkin tidak ingin membuat perubahan drastis pada titik ini, tetapi apa yang Anda jelaskan adalah kasus penggunaan untuk Graph Database . Database Grafik didasarkan pada teori grafik, yang merupakan apa yang Anda sentuh dengan mencoba menemukan jalur antara 'X' dan 'Y' di seluruh grafik rute bus yang diarahkan.
Jika Anda belum melihatnya, intip sesuatu seperti Neo4J . Ini memiliki API REST dan Anda dapat menemukan klien PHP untuk itu.
Anda akan menemukan sekelompok orang dari Stack Overflow yang dapat membantu dengan sisi implementasi dari berbagai hal.
sumber
Katakanlah pengguna ingin beralih dari
$start_id
ke$end_id
(keduanya adalah nilai stop_id yang valid). Anda dapat menggunakan kueri ini untuk menemukan rute yang valid dari$start_id
ke$end_id
:Cari rute langsung (jalur tunggal):
Jika tidak ada hasil dengan permintaan sebelumnya, maka cari rute menggunakan 2 lignes:
Ganti
*
dengan bidang yang benar-benar perlu Anda ambil.sumber
bus_stops bs5
) untuk menyelesaikan rute?