Baru-baru ini saya belajar tentang bagaimana hubungan didefinisikan dalam database di tempat kerja, dan bertanya-tanya apakah ini merupakan praktik standar.
Katakanlah kita memiliki dua proses: Proses A, dan Proses B. Proses B tergantung pada hasil dari Proses A, jadi ada hubungan yang perlu didefinisikan antara proses B berjalan dan proses A berjalan. Inilah bagaimana hubungan didefinisikan:
TableProcessA:
Id
dan
TableProcessB:
Id
ProcessAId
Sekarang, sampai titik ini, hal-hal masuk akal bagi saya, tetapi kemudian hal-hal menjadi sedikit aneh bagi saya dan pemahaman saya tentang desain tabel. Setiap kali sebuah baris dibuat di TableProcessA atau TableProcessB, sebuah fungsi disebut yang menciptakan id unik secara global untuk masing-masing. Jadi pada dasarnya, semua bidang Id di TableProcessA dan TableProcessB tidak akan berisi kecocokan apa pun karena ID tidak hanya unik untuk tabelnya, tetapi ke seluruh database.
Pertanyaan saya adalah, bagaimana standarnya ini? Saya dibesarkan dengan gagasan bahwa setiap tabel harus hanya memiliki id autoincrementing yang unik hanya untuk tabel dan bukan seluruh database.
sumber
Jawaban:
Ini bukan praktik yang aneh. Itu disebut GUID, atau ID Unik Global. Idenya adalah bahwa, dengan diberi GUID, Anda dapat mengetahui dengan pasti data apa yang dimiliki id karena itu akan unik di mana - mana . GUID paling baik digunakan ketika Anda akan menggabungkan berbagai sumber data serupa; misalnya inventaris untuk toko yang berbeda.
Saya akan melakukan riset dan mencari tahu mengapa ini adalah praktik umum di lingkungan Anda. Mungkin itu dibutuhkan, mungkin juga tidak.
sumber
Pada prinsipnya memiliki Id unik di database tidak terlalu buruk tetapi agak tidak biasa dalam pengalaman saya. Kecuali jika ada persyaratan khusus untuk mempertahankan kunci ID yang unik secara global, menggunakan identitas normal akan baik-baik saja karena tipe entitas atau objek cenderung tipe spesifik dan biasanya tidak menghasilkan gabungan yang tidak sesuai.
Sebagai tambahan untuk pertanyaan Anda, saya sangat menyarankan untuk tidak menggunakan GUID sebagai kunci utama atau pengganti karena membutuhkan 4x ruang int. Sekarang di hari-hari multi-gigabyte disk Anda mungkin mengatakan itu tidak penting tetapi ketika Anda memiliki beberapa juta baris data masih membutuhkan sumber daya untuk membaca dari disk atau transfer melalui jaringan, terlebih lagi jika mereka dimasukkan dalam indeks. Sementara saya berada di indeks subjek, GUID buruk dalam kunci primer karena sifatnya acak dan biasanya menyebabkan fragmentasi yang signifikan.
Sekarang sepertinya sudah terlambat untuk database ini, tetapi ingatlah untuk masa depan
sumber
Proses Anda dapat membuat catatan yang berisi GUID sebagai referensi ke instance proses, tetapi menggunakan GUID sebagai kunci belum tentu optimal.
Saya melihat tiga kelemahan utama menggunakan GUID sebagai kunci basis data, dan akan menghindarinya kecuali jika Anda memiliki alasan kuat untuk menggunakannya. Perhatikan bahwa properti unik global tidak memberi Anda keuntungan apa pun daripada menggunakan kunci yang unik secara lokal di dalam tabel, karena Anda sudah tahu dari tabel mana data itu berasal.
Ketidaknyamanan: Tidak mudah untuk mengetikkan GUID jika Anda ingin melakukan kueri ad-hoc dari database, misalnya:
vs.
Yang terakhir praktis berarti Anda membutuhkan sumber GUID untuk memotong dan menempel.
2. Tata cara alami: Kunci primer peningkatan otomatis memiliki efek samping memesan secara alami transaksi Anda sesuai urutan masuknya ke dalam sistem. Ini sering sangat berguna. GUID biasanya tidak dibuat secara berurutan, sehingga tidak ada gunanya dalam hal ini.
3. Ukuran: Lebih sedikit masalah hari ini, tetapi GUID panjangnya 16 byte. Dibutuhkan lebih banyak ruang dalam tabel dan indeks apa pun yang memasukkannya.
sumber
Saya tidak akan mengatakan bahwa itu normal, tetapi tidak abnormal untuk mengatur semuanya dengan cara ini.
sumber