Saya telah melakukan riset dan menemukan bahwa saya harus menyimpan rute sebagai urutan pemberhentian. Sesuatu seperti:
Start -> Stop A -> Stop B -> Stop C -> End
Saya telah membuat tiga tabel:
- Rute
- Berhenti
- RouteStops
... di mana RouteStops adalah tabel persimpangan.
Saya punya sesuatu seperti:
Rute
+---------+
| routeId |
+---------+
| 1 |
+---------+
| 2 |
+---------+
Stasiun
+-----------+------+
| 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 |
+-------------+---------------+
Rute 1 melewati
Station A -> Station C -> Station D
Rute 2 melewati
Station A -> Station D
Apakah ini cara yang baik untuk menyimpan rute?
Menurut Wikipedia :
[...] sistem database tidak menjamin pemesanan baris kecuali jika
ORDER BY
klausa ditentukan [...]
Bisakah saya mengandalkan skema database seperti itu atau mungkin ini harus dilakukan secara berbeda?
Ini sebenarnya proyek universitas saya, jadi saya hanya ingin tahu apakah skema seperti itu dapat dianggap sebagai yang benar. Untuk kasus ini, saya mungkin akan menyimpan hanya beberapa rute (sekitar 3-5) dan stasiun (sekitar 10-15), setiap rute akan terdiri dari sekitar 5 stasiun. Saya juga akan senang mendengar bagaimana ini akan terlihat dalam kasus perusahaan bus nyata dan besar.
sumber
Jawaban:
Untuk semua analisis bisnis yang mengarah ke arsitektur basis data, saya merekomendasikan aturan penulisan:
Aturan 1 dan 2 seperti yang Anda perhatikan menyiratkan hubungan banyak ke banyak sehingga Anda menyimpulkan dengan benar untuk membuat routeStations.
Aturan ke-3 adalah aturan yang menarik. Ini menyiratkan bahwa kolom tambahan diperlukan untuk memenuhi persyaratan. Kemana harus pergi? Kita dapat melihat bahwa properti ini tergantung pada Rute DAN Stasiun. Oleh karena itu harus ditempatkan di routeStations.
Saya akan menambahkan kolom ke tabel routeStations yang disebut "stationOrder".
Maka kueri menjadi mudah:
Catatan:
Untuk mengembangkan pada catatan 3, saya telah membangun use case:
Ini adalah Oracle 12c Enterprise.
Perhatikan bahwa dalam rencana eksekusi di bawah ini, rute tabel tidak digunakan sama sekali. Pengoptimal Basis Biaya (CBO) tahu itu bisa mendapatkan routeId langsung dari kunci primer routeStations (langkah 5, INDEX RANGE SCAN pada ROUTESTATIONS_PK, Informasi Predikat 5 - akses ("RS". "ROUTEID" = 1))
Sekarang bagian yang menyenangkan, mari kita tambahkan nama kolom ke tabel rute. Sekarang ada kolom yang sebenarnya kita butuhkan di "rute". CBO menggunakan indeks untuk menemukan rowID untuk rute 1, kemudian mengakses tabel (akses tabel dengan indeks rowid) dan mengambil kolom "routes.name".
sumber
Anda benar, tidak ada urutan rekaman yang melekat dalam tabel relasional. Ini berarti Anda perlu memberikan cara pemesanan stasiun secara eksplisit dalam setiap rute.
Bergantung pada bagaimana Anda berencana mengakses data yang Anda bisa
sequenceNumber
kolom keRouteStations
untuk menyimpan, jelas, urutan masing-masing stasiun di setiap rute.nextStationId
kolom untuk menyimpan "pointer" ke stasiun berikutnya di setiap rute.sumber
Saya tidak melihat ada yang menyatakan tentang hal ini jadi saya pikir saya akan menambah nilai Anda. Saya juga menempatkan indeks Unik yang tidak berkerumun (tergantung pada RDBMS Anda) pada tabel RouteStations / RouteStops di ketiga kolom. Dengan cara ini Anda tidak akan dapat membuat kesalahan dan meminta bus pergi ke 2 stasiun berikutnya. Ini akan mempersulit pembaruan, tetapi saya pikir masih harus dipertimbangkan sebagai bagian dari desain yang bagus.
sumber
Saya berbicara sebagai pemrogram aplikasi :
Jangan pernah berpikir untuk melakukan perutean atau penjadwalan dengan pertanyaan terhadap basis data (atau dalam proc yang disimpan) itu tidak akan pernah cukup cepat. ( Kecuali ini hanya masalah "pekerjaan rumah". )
Bahkan untuk aplikasi yang memproses data dalam memori memuat data dari database tidak akan pernah cepat kecuali semua data dimuat saat start up, atau data disimpan dalam bentuk demoralisasi. Setelah data mengalami demoralisasi, tidak ada gunanya menggunakan database relasional.
Oleh karena itu saya akan menganggap database sebagai salinan "master" dari data dan menerima bahwa saya juga harus menyimpannya pra-diproses dalam memori aplikasi, atau di server cashing seperti membase.
Jawaban ndefontenay memberikan desain tabel yang baik sebagai titik awal, tetapi Anda harus mempertimbangkan bahwa rute memiliki waktu yang berbeda tergantung pada waktu hari dan sering memiliki pemberhentian yang berbeda tergantung pada waktu, hari dalam seminggu, atau bahkan liburan sekolah.
sumber