it-swarm.asia

Guid vs INT - Mana yang lebih baik sebagai kunci utama?

Saya sudah membaca alasan untuk menggunakan atau tidak Guid dan int.

int lebih kecil, lebih cepat, mudah diingat, menyimpan urutan kronologis. Dan untuk Guid, satu-satunya keuntungan yang saya temukan adalah unik. Dalam hal ini Guid akan lebih baik daripada dan int dan mengapa?

Dari apa yang saya lihat, int tidak memiliki kekurangan kecuali dengan batas angka, yang dalam banyak kasus tidak relevan.

Mengapa tepatnya Guid dibuat? Saya benar-benar berpikir itu memiliki tujuan selain berfungsi sebagai kunci utama dari sebuah tabel sederhana. (Adakah contoh aplikasi nyata menggunakan Guid untuk sesuatu?)

(Guid = UniqueIdentifier) ​​ketik SQL Server

107
BrunoLM

Ini telah ditanyakan dalam Stack Overflow di sini dan di sini .

posting Jeff menjelaskan banyak tentang pro dan kontra menggunakan GUID.

GUID Pro

  • Unik di setiap tabel, setiap basis data, dan setiap server
  • Mengizinkan penggabungan catatan dengan mudah dari database yang berbeda
  • Mengizinkan distribusi basis data dengan mudah di beberapa server
  • Anda dapat membuat ID di mana saja, alih-alih harus bolak-balik ke database
  • Sebagian besar skenario replikasi membutuhkan GUID kolom pula

Kontra GUID

  • Ini adalah kekalahan 4 kali lebih besar dari nilai indeks 4 byte tradisional; ini dapat memiliki implikasi kinerja dan penyimpanan yang serius jika Anda tidak berhati-hati
  • Tidak praktis untuk debug (where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • GUID yang dihasilkan sebagian harus berurutan untuk kinerja terbaik (misalnya, newsequentialid() pada SQL Server 2005+) dan untuk memungkinkan penggunaan indeks berkerumun

Jika Anda yakin tentang kinerja dan Anda tidak berencana untuk mereplikasi atau menggabungkan catatan, maka gunakan int, dan atur secara otomatis peningkatan ( identitas benih di SQL Server ).

94
CoderHawk

Jika Anda menyinkronkan data Anda dengan sumber eksternal, GUID bisa lebih baik. Contoh cepat di mana kami menggunakan GUID adalah alat yang dikirim ke pelanggan untuk merayapi jaringan mereka dan melakukan kelas-kelas tertentu dari penemuan otomatis, menyimpan catatan yang ditemukan, dan kemudian semua catatan pelanggan diintegrasikan ke dalam database pusat kembali pada akhir kita. Jika kita menggunakan integer, kita akan memiliki 7.398 "1", dan akan jauh lebih sulit untuk melacak "1" yang mana.

19
TML

Saya telah menggunakan pendekatan hibrida dengan sukses. Tabel berisi KEDUA integer kunci primer kenaikan-otomatis id kolom DAN kolom guid. guid dapat digunakan sesuai kebutuhan untuk secara global mengidentifikasi baris dan id dapat digunakan untuk permintaan, penyortiran dan identifikasi manusia dari baris.

18
rmirabelle

Beberapa praktik terbaik di luar sana masih menyebutkan bahwa Anda harus menggunakan tipe data yang mengakomodasi dengan sedikit memori yang memungkinkan seluruh rangkaian nilai yang akan Anda gunakan. Misalnya, jika Anda menggunakannya untuk menyimpan jumlah pengusaha dalam bisnis kecil dan Anda tidak mungkin mencapai 100, maka tidak ada yang akan menyarankan menggunakan nilai bigint sementara int (bahkan smallint) akan melakukannya.

Tentu saja, kelemahannya seperti "Katakan tidak pada skalabilitas!"


Juga, saya tahu ini tidak sepenuhnya terkait, tetapi ada faktor lain tentang ini. Ketika tidak berlebihan, saya biasanya mencoba merekomendasikan untuk menggunakan kunci primer yang tidak diautogenisasi, jika itu masuk akal. Misalnya, jika Anda menyimpan informasi pengemudi, jangan repot-repot membuat kolom autogenerated baru untuk "ID", cukup gunakan nomor lisensi.

Saya tahu ini terdengar sangat jelas, tetapi saya melihat itu cukup sering dilupakan.

Untuk konteks: bagian dari jawaban ini dialamatkan dari pendekatan teoretis data, di mana Anda ingin PK Anda menjadi pengidentifikasi data unik untuk catatan. Sebagian besar waktu kita buat itu ketika sudah ada, maka jawaban sebelumnya.

Namun, sangat jarang bahwa Anda dapat memiliki kontrol ketat atas titik data ini, dan karenanya, Anda mungkin perlu melakukan koreksi atau penyesuaian. Anda tidak dapat melakukannya dengan kunci primer (yah, Anda bisa, tetapi itu bisa menyebalkan).

Terima kasih @VahiD untuk klarifikasi.

1
Alpha

Menggunakan ID kenaikan otomatis dapat membocorkan informasi tentang aktivitas bisnis Anda. Jika Anda menjalankan toko dan menggunakan order_id untuk secara terbuka mengidentifikasi pembelian, maka siapa pun dapat mengetahui jumlah penjualan bulanan Anda dengan aritmatika sederhana.

1
golopot

@rmirrabelle jawaban di atas - https://dba.stackexchange.com/a/96990/118371 adalah apa yang saya lakukan. Namun, untuk proyek skala besar, ada desain pamungkas.

Gunakan: Tabel Pemetaan Kunci

TableA

- ID int (PK)
- Data varchar(100)

TableAMap

- ID int (PK)
- UniversalID GUID (Indexed - nonclustered)

Seperti yang telah didiskusikan orang lain di utas ini, GUID jarang diperlukan untuk replikasi/impor/expansi basis data. Jadi, alih-alih memiliki GUID di tabel utama, di mana ia membutuhkan tambahan 8-byte per baris, dan di mana indeks GUID akan menjadi ( secara default) disimpan pada volume yang sama; tabel terpisah (alias normalisasi) datang untuk menyelamatkan.

Dengan tabel terpisah, DBA Anda bebas untuk menyimpannya di disk yang lebih lambat. Juga, jika GUID HANYA diperlukan untuk pekerjaan batch tertentu, Anda dapat membuat indeks GUID tepat sebelum dibutuhkan, lalu lepaskan setelah itu.

0
Todd

Hal lain dengan cara GUID dihasilkan. mrdenny dengan tepat menunjukkan bahwa walaupun newitialentialid () sedang digunakan, memulai kembali instans menyebabkan nilai baru dimulai dengan "lubang" yang tertinggal dalam pemrosesan sebelumnya. Hal lain yang memengaruhi GUID "berurutan" adalah kartu jaringan. Jika saya ingat dengan benar, UID dari NIC digunakan sebagai bagian dari algoritma GUID. Jika a NIC adalah diganti, tidak ada jaminan bahwa UID akan menjadi nilai yang lebih tinggi untuk mempertahankan aspek sekuensial dari berbagai hal. Saya juga tidak yakin bagaimana beberapa NIC dapat mempengaruhi penetapan nilai menggunakan algoritma.

Hanya sebuah pemikiran dan saya harap saya mengingat dengan benar. Semoga hari mu menyenangkan!

0
bobo8734