Apakah ini cara standar untuk merancang basis data?

8

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.

sooprise
sumber
3
mungkin menarik: dba.stackexchange.com/questions/322/…
Derek Downey
Louis Davidson memiliki banyak posting tentang desain basis data: sqlblog.com/blogs/louis_davidson/archive/tags/Database+Design/… . Hati-hati saat menyimpan data secara terpisah dengan proses kecuali hanya untuk logging.
Eric Humphrey - lotsahelp

Jawaban:

7

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.

DForck42
sumber
4

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

GrumpyMonkey
sumber
4

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:

select *
  from Foo
 where FooID = 12345

vs.

select *
  from Foo
 where FooID = convert (uniqueidentifier, '5E64E653-35F0-4803-B459-F5F59C701F22')

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.

ConcernedOfTunbridgeWells
sumber
ID unik global sebenarnya adalah bilangan bulat yang hanya ++ setiap kali ada yang baru. Apakah ini praktik umum atau apakah GUID selalu sepanjang 16 byte?
sooprise
GUID adalah 128 bit (16 byte) sehingga memiliki ruang nama yang cukup besar. Secara tradisional mereka memasukkan item-item unik seperti alamat MAC dan cap waktu untuk memberikan beberapa bagian dari nilai basis yang benar-benar unik. Saya bertanya-tanya apa jenis pengidentifikasi Anda dan apakah mereka benar-benar GUID - biasanya GUID setidaknya sebagian acak.
ConcernedOfTunbridgeWells
ID dihasilkan dengan mencari semua ID, mengambil maks, dan menambahkan 1.
sooprise
0

Saya tidak akan mengatakan bahwa itu normal, tetapi tidak abnormal untuk mengatur semuanya dengan cara ini.

mrdenny
sumber
2
-1 seperti apa adanya, jawaban ini tidak benar-benar memberikan sesuatu yang bermanfaat.
Derek Downey
1
secara teknis itu menjawab pertanyaan
DForck42
2
Jawaban ya. Memberikan sesuatu yang bermanfaat, tidak.
Matt Hanson
Denny - sebagai moderator dan DBA yang sangat berpengalaman, saya terkejut Anda tidak menambahkan sedikit lebih detail pada jawaban Anda. Mungkin akan menyenangkan untuk mengatakan mengapa menghasilkan GUID secara acak adalah praktik yang buruk pada umumnya, atau mengapa itu tidak benar-benar menimbulkan masalah dalam hal keunikan. Seperti berdiri, sistem ingin tahu apakah saya harus merekomendasikan penghapusan posting Anda.
Max Vernon