Dalam database saya, saya cenderung membiasakan diri memiliki kunci primer bilangan bulat yang bertambah secara otomatis dengan nama id
untuk setiap tabel yang saya buat sehingga saya memiliki pencarian yang unik untuk setiap baris tertentu.
Apakah ini dianggap ide yang buruk? Apakah ada kelemahan untuk melakukannya dengan cara ini? Kadang-kadang saya akan memiliki beberapa indeks seperti id, profile_id, subscriptions
mana id
adalah pengenal unik, profile_id
link ke asing id
dari Profile
meja, dll
Atau ada skenario di mana Anda tidak ingin menambahkan bidang seperti itu?
t
, dan aset 120 pada waktut + 60
. Jika Anda dapat melihat kedua ID tersebut (100 dan 120) dalam bentuk tanpa campur tangan, Anda sekarang tahu jumlah total aset yang ada, serta kira-kira tingkat pembuatannya. Ini adalah kebocoran informasi. Ini bukan murni hipotetis.Jawaban:
Tidak pernah merupakan ide buruk untuk memiliki pengidentifikasi baris unik yang dijamin. Saya kira saya seharusnya tidak mengatakan tidak pernah - tapi mari kita pergi dengan mayoritas waktu itu adalah ide yang bagus.
Kerugian potensial teoretis termasuk indeks ekstra untuk mempertahankan dan ruang penyimpanan tambahan yang digunakan. Itu tidak pernah cukup alasan bagi saya untuk tidak menggunakannya.
sumber
TableName.id
sebagai lawanTableName.TableName_id
, karena apa lagi yangid
akan merujuk? Jika saya memiliki bidang id lain dalam tabel maka saya akan awalan dengan nama tabel jika mengacu pada beberapa tabel lainWITHOUT ROWID
tabel (dengan eksplisitPRIMARY KEY
) sebagai optimisasi. Tetapi sebaliknya,INTEGER PRIMARY KEY
kolom adalah alias untuk rowid.Saya tidak setuju dengan semua jawaban sebelumnya. Ada banyak alasan mengapa menambahkan bidang kenaikan otomatis di semua tabel merupakan ide yang buruk.
Jika Anda memiliki tabel di mana tidak ada kunci yang jelas, bidang kenaikan otomatis sepertinya ide yang bagus. Lagi pula, Anda tidak mau
select * from blog where body = '[10000 character string]'
. Anda lebih sukaselect * from blog where id = 42
. Saya berpendapat bahwa dalam sebagian besar kasus ini, apa yang Anda inginkan adalah pengidentifikasi unik; bukan pengidentifikasi unik berurutan. Anda mungkin ingin menggunakan pengidentifikasi unik universal.Ada fungsi di sebagian besar database untuk menghasilkan pengidentifikasi unik acak (
uuid
di mysql, postgres.newid
Di mssql). Ini memungkinkan Anda untuk menghasilkan data ke banyak basis data, pada mesin yang berbeda, kapan saja, tanpa koneksi jaringan di antara mereka, dan masih menggabungkan data dengan nol konflik. Ini memungkinkan Anda untuk lebih mudah men-setup beberapa server dan bahkan pusat data, seperti misalnya, dengan layanan microser.Ini juga menghindari penyerang menebak url ke halaman yang seharusnya tidak mereka akses. Jika ada,
https://example.com/user/1263
mungkin adahttps://example.com/user/1262
juga. Ini dapat memungkinkan otomasi eksploitasi keamanan di halaman profil pengguna.Ada juga banyak kasus di mana kolom uuid tidak berguna atau bahkan berbahaya. Katakanlah Anda memiliki jejaring sosial. Ada
users
meja danfriends
meja. Tabel teman berisi dua kolom userid dan bidang penambahan otomatis. Anda ingin3
berteman dengan5
, jadi Anda memasukkan3,5
ke dalam database. Basis data menambahkan id peningkatan otomatis dan menyimpan1,3,5
. Entah bagaimana, pengguna3
mengklik tombol "tambah teman" lagi. Anda memasukkan lagi3,5
ke dalam database, database menambahkan id dan sisipan peningkatan otomatis2,3,5
. Tapi sekarang3
dan5
berteman satu sama lain dua kali! Itu buang-buang ruang, dan kalau dipikir-pikir, begitu juga kolom kenaikan-otomatis. Yang perlu Anda lihat jikaa
danb
adalah teman untuk memilih baris dengan dua nilai tersebut. Mereka, bersama-sama, pengidentifikasi baris yang unik. (Anda mungkin ingin menulis logika untuk memastikan3,5
dan5,3
dideduplikasi.)Masih ada beberapa kasus di mana id berurutan dapat berguna, seperti saat membuat pemendek-url, tetapi kebanyakan (dan bahkan dengan pemendek url), id unik yang dihasilkan secara acak adalah yang benar-benar ingin Anda gunakan.
TL; DR: Gunakan UUID sebagai ganti kenaikan otomatis, jika Anda belum memiliki cara unik untuk mengidentifikasi setiap baris.
sumber
Kunci autoincemental sebagian besar memiliki keunggulan.
Tetapi beberapa kelemahan yang mungkin terjadi adalah:
Inilah bagian artikel Wikipedia tentang kerugian kunci pengganti.
sumber
Justru sebaliknya, Tidak, Anda TIDAK perlu selalu memiliki PK AutoInc numerik.
Jika Anda menganalisis data dengan cermat, Anda sering mengidentifikasi kunci alami dalam data. Ini sering terjadi ketika data memiliki makna intrinsik untuk bisnis. Kadang-kadang PK adalah artefak dari sistem kuno yang digunakan pengguna bisnis sebagai bahasa kedua untuk menggambarkan atribut sistem mereka. Saya telah melihat nomor VIN kendaraan yang digunakan sebagai kunci utama dari tabel "Kendaraan" dalam sistem manajemen armada misalnya.
Namun itu berasal, JIKA Anda sudah memiliki pengidentifikasi unik, gunakan itu. Jangan membuat kunci primer kedua yang tidak berarti; boros dan dapat menyebabkan kesalahan.
Kadang-kadang Anda dapat menggunakan AutoInc PK untuk menghasilkan nilai bermakna pelanggan misalnya Nomor Kebijakan. Menetapkan nilai awal untuk sesuatu yang masuk akal dan menerapkan aturan bisnis tentang memimpin nol dll. Ini mungkin merupakan pendekatan "terbaik dari kedua dunia".
Ketika Anda memiliki sejumlah kecil nilai yang relatif statis, gunakan nilai yang masuk akal bagi pengguna sistem. Mengapa menggunakan 1,2,3 ketika Anda bisa menggunakan L, C, H di mana L, H dan C mewakili Life, Car dan Home dalam konteks "Tipe Kebijakan" asuransi, atau, kembali ke contoh VIN, bagaimana menggunakan "TO "untuk Toyota? Semua mobil Toyata memiliki VIN yang dimulai dengan "TO". Satu hal yang kurang diingat oleh pengguna, membuatnya lebih kecil kemungkinannya untuk memperkenalkan pemrograman dan kesalahan pengguna dan bahkan bisa menjadi pengganti yang dapat digunakan untuk deskripsi lengkap dalam laporan manajemen sehingga laporan menjadi lebih sederhana untuk menulis dan mungkin lebih cepat untuk menghasilkan.
Pengembangan lebih lanjut dari ini mungkin "jembatan terlalu jauh" dan saya biasanya tidak merekomendasikannya tapi saya memasukkannya untuk kelengkapan dan Anda mungkin menemukan manfaatnya. Yaitu, gunakan Deskripsi sebagai Kunci Utama. Untuk mengubah data dengan cepat, ini adalah kekejian. Untuk data yang sangat statis yang dilaporkan di All The Time , mungkin tidak. Sebut saja jadi itu duduk di sana sebagai kemungkinan.
Saya DO menggunakan PK AutoInc, saya hanya melibatkan otak saya dan mencari alternatif yang lebih baik terlebih dahulu. Seni desain database membuat sesuatu yang bermakna yang dapat ditanyakan dengan cepat. Terlalu banyak bergabung menghalangi ini.
EDIT Satu kasus penting lainnya di mana Anda tidak memerlukan PK Autogenerated adalah kasus tabel yang mewakili persimpangan dua tabel lainnya. Untuk tetap dengan analogi Mobil, A Car memiliki 0..n Aksesori, Setiap Aksesori dapat ditemukan di banyak mobil. Jadi untuk mewakili ini, Anda membuat tabel Car_Accessory yang berisi PK dari Mobil dan Aksesori dan informasi terkait lainnya tentang tautan Tanggal, dll.
Yang tidak Anda perlukan (biasanya) adalah AutoInc PK di tabel ini - ini hanya akan diakses melalui mobil "beri tahu saya aksesori apa yang ada di mobil ini" atau dari Aksesori "beri tahu mereka mobil yang memiliki aksesori ini"
sumber
Don't create a second, meaningless primary key; it's wasteful and may cause errors.
Namun, jika cara Anda membangun keunikan untuk suatu catatan adalah kombinasi dari 6 kolom, maka bergabung pada semua 6 sepanjang waktu sangat rentan terhadap kesalahan itu sendiri. Data secara alami memang memiliki PK tetapi Anda lebih baik menggunakanid
kolom dan kendala unik pada 6 kolom tersebut.Banyak tabel sudah memiliki id unik alami. Jangan menambahkan kolom id unik lain (peningkatan otomatis atau lainnya) ke tabel ini. Gunakan id unik alami sebagai gantinya. Jika Anda menambahkan id unik lain, pada dasarnya Anda memiliki redundansi (duplikasi atau ketergantungan) dalam data Anda. Ini bertentangan dengan prinsip normalisasi. Satu id unik tergantung pada yang lain untuk akurasi. Ini berarti bahwa mereka harus tetap sinkron dengan sempurna setiap saat di setiap sistem yang mengelola baris ini. Ini hanya kerapuhan lain dalam integritas data Anda yang Anda tidak ingin harus mengelola dan memvalidasi untuk jangka panjang.
Sebagian besar tabel saat ini tidak benar-benar membutuhkan peningkatan kinerja yang sangat kecil yang diberikan oleh kolom id unik tambahan (dan kadang-kadang bahkan mengurangi kinerja). Sebagai aturan umum dalam TI, hindari redundansi seperti wabah! Menahannya di mana saja disarankan untuk Anda. Ini laknat. Dan perhatikan kutipannya. Semuanya harus sesederhana mungkin, tetapi tidak sederhana. Jangan memiliki dua id unik di mana satu akan cukup, bahkan jika yang alami tampaknya kurang rapi.
sumber
Pada sistem yang lebih besar, ID adalah booster konsistensi, gunakan hampir di mana saja. Dalam konteks ini, masing-masing kunci primer TIDAK direkomendasikan, mereka mahal di garis bawah (baca alasannya).
Setiap aturan memiliki pengecualian, jadi Anda mungkin tidak perlu ID autoincrement integer pada tabel staging yang digunakan untuk ekspor / impor dan pada tabel satu arah atau tabel sementara yang serupa. Anda juga akan lebih memilih GUID daripada ID pada sistem terdistribusi.
Banyak jawaban di sini menunjukkan bahwa kunci unik yang ada harus diambil. Yah bahkan jika itu memiliki 150 karakter? Saya kira tidak.
Sekarang poin utama saya:
Tampaknya lawan ID bilangan bulat autoincrement berbicara tentang database kecil hingga 20 tabel. Di sana mereka mampu melakukan pendekatan individual ke setiap tabel.
TETAPI begitu Anda memiliki ERP dengan 400 tabel, memiliki integer autoincrement ID di mana saja (kecuali kasus yang disebutkan di atas) masuk akal. Anda tidak bergantung pada bidang unik lainnya bahkan jika itu ada dan dijamin untuk keunikan.
JOIN
tabel, tanpa perlu memeriksa apa kuncinya.Pada sistem yang lebih besar, ada baiknya mengabaikan manfaat kecil dari masing-masing kunci primer dan secara konsisten menggunakan ID bilangan bulat autoreguler dalam kebanyakan kasus. Menggunakan bidang unik yang ada sebagai kunci utama mungkin menghemat beberapa byte per catatan tetapi penyimpanan tambahan atau waktu pengindeksan tidak menimbulkan masalah di mesin basis data saat ini. Sebenarnya Anda kehilangan lebih banyak uang dan sumber daya pada waktu yang terbuang dari pengembang / pengelola. Perangkat lunak saat ini harus dioptimalkan untuk waktu dan upaya programmer - pendekatan apa yang memenuhi ID konsisten jauh lebih baik.
sumber
Ini bukan praktik yang baik untuk desain berlebihan. Yaitu - itu bukan praktik yang baik untuk selalu memiliki kunci primer int auto increment ketika seseorang tidak diperlukan.
Mari kita lihat contoh di mana seseorang tidak diperlukan.
Anda memiliki tabel untuk artikel - ini memiliki kunci primer int
id
, dan kolom varchar bernamatitle
.Anda juga memiliki tabel yang penuh dengan kategori
id
artikel– int primary key, varcharname
.Satu baris dalam tabel Artikel memiliki
id
5, dantitle
"Cara memasak angsa dengan mentega". Anda ingin menautkan artikel itu dengan baris berikut di tabel Kategori Anda: "Fowl" ( id : 20), "Goose" ( id : 12), "Cooking" ( id : 2), "Butter" (id: 9) .Sekarang, Anda memiliki 2 tabel: artikel dan kategori. Bagaimana Anda menciptakan hubungan di antara keduanya?
Anda bisa memiliki tabel dengan 3 kolom: id (kunci utama), article_id (kunci asing), category_id (kunci asing). Tetapi sekarang Anda memiliki sesuatu seperti:
Solusi yang lebih baik adalah memiliki kunci utama yang terdiri dari 2 kolom.
Ini dapat dicapai dengan melakukan:
Alasan lain untuk tidak menggunakan integer kenaikan otomatis adalah jika Anda menggunakan UUID untuk kunci utama Anda.
UUID menurut definisi mereka unik, yang melakukan hal yang sama dengan menggunakan integer unik. Mereka juga memiliki manfaat tambahan (dan kontra) mereka sendiri di atas bilangan bulat. Misalnya, dengan UUID, Anda tahu bahwa string unik yang Anda maksudkan menunjuk ke catatan data tertentu; ini berguna dalam kasus di mana Anda tidak memiliki 1 basis data pusat, atau di mana aplikasi memiliki kemampuan untuk membuat catatan data offline (kemudian unggah ke database di kemudian hari).
Pada akhirnya, Anda tidak perlu memikirkan kunci primer sebagai suatu hal. Anda perlu menganggap mereka sebagai fungsi yang mereka lakukan. Mengapa Anda memerlukan kunci utama? Untuk dapat mengidentifikasi secara unik set data tertentu dari tabel menggunakan bidang yang tidak akan diubah di masa mendatang. Apakah Anda memerlukan kolom tertentu yang dipanggil
id
untuk melakukan ini, atau dapatkah Anda mendasarkan identifikasi unik ini dari data lain (tidak dapat diubah)?sumber
Tentu.
Pertama-tama, ada database yang tidak memiliki autoincrements (misalnya, Oracle, yang tentunya bukan salah satu pesaing terkecil di sekitar). Ini harus menjadi indikasi pertama bahwa tidak semua orang menyukai atau membutuhkannya.
Lebih penting, berpikir tentang apa ID sebenarnya adalah - itu adalah kunci utama untuk data Anda. Jika Anda memiliki tabel dengan kunci utama yang berbeda, maka Anda tidak perlu ID, dan tidak boleh memilikinya. Misalnya, sebuah tabel
(EMPLOYEE_ID, TEAM_ID)
(di mana setiap karyawan dapat berada di beberapa tim secara bersamaan) memiliki kunci utama yang jelas terdiri dari dua ID tersebut. MenambahkanID
kolom peningkatan otomatis , yang juga menjadi kunci utama untuk tabel ini, tidak masuk akal sama sekali. Sekarang Anda menyeret 2 kunci utama, dan kata pertama dalam "kunci utama" akan memberi Anda petunjuk bahwa Anda benar-benar hanya memiliki satu.sumber
Saya biasanya menggunakan kolom "identitas" (integer peningkatan-otomatis) ketika mendefinisikan tabel baru untuk data "berumur panjang" (catatan saya berharap untuk memasukkan sekali dan tetap di sekitar tanpa batas bahkan jika akhirnya "dihapus secara logis" dengan menetapkan sedikit bidang ).
Ada beberapa situasi yang dapat saya pikirkan ketika Anda tidak ingin menggunakannya, yang sebagian besar mengarah ke skenario di mana satu tabel pada satu contoh DB tidak bisa menjadi sumber otoritatif untuk nilai ID baru:
Ada solusi yang memungkinkan penggunaan kolom identitas dalam situasi ini, seperti yang saya harapkan, tetapi dalam sebagian besar dari ini, peningkatan dari kolom integer identitas ke GUID lebih sederhana dan menyelesaikan masalah lebih lengkap.
sumber
ID, ID_M, ID_N
) karena melampirkan properti ke instance relasi M: N Anda.Kunci primer yang ditambahkan secara otomatis (identitas) adalah ide yang baik kecuali untuk mencatat bahwa itu tidak berarti di luar konteks database dan klien langsung dari database tersebut. Misalnya, jika Anda mentransfer dan menyimpan beberapa data di database lain, kemudian lanjutkan untuk menulis data yang berbeda untuk kedua tabel database, id akan berbeda - yaitu, data dengan id 42 dalam satu database tidak akan selalu cocok dengan data dengan id 42 di yang lain.
Mengingat hal ini, jika perlu masih dapat mengidentifikasi baris secara unik di luar basis data (dan memang sering demikian), maka Anda harus memiliki kunci yang berbeda untuk tujuan ini. Kunci bisnis yang dipilih dengan cermat akan berhasil, tetapi Anda akan sering berakhir di posisi sejumlah besar kolom yang diperlukan untuk menjamin keunikan. Teknik lain adalah memiliki kolom Id sebagai kunci primer clustered auto-increment dan kolom pengenal unik lainnya (guid) sebagai kunci unik yang tidak dikelompokkan, untuk keperluan mengidentifikasi baris secara unik di mana pun baris itu ada di dunia. Alasan Anda masih memiliki kunci yang ditambahkan otomatis dalam kasus ini adalah karena lebih efisien untuk mengelompokkan dan mengindeks kunci penambahan otomatis daripada melakukan hal yang sama pada pemandu.
Satu kasus di mana Anda mungkin tidak ingin kunci penambahan otomatis akan menjadi tabel banyak-ke-banyak di mana kunci primer adalah gabungan dari kolom Id dari dua tabel lain (Anda masih bisa memiliki kunci penambahan otomatis di sini, tapi saya tidak mengerti maksudnya).
Satu pertanyaan lain adalah tipe data dari kunci yang ditambahkan otomatis. Menggunakan Int32 memberi Anda rentang nilai yang besar, tetapi relatif terbatas. Secara pribadi saya sering menggunakan kolom bigint untuk ID, agar secara praktis tidak perlu khawatir kehabisan nilai.
sumber
Karena orang lain telah membuat kasus untuk kunci primer yang bertambah saya akan membuat satu untuk GUID:
Edit: Titik Gandakan
sumber
Sebagai prinsip desain yang baik, setiap tabel harus memiliki cara yang andal untuk mengidentifikasi satu baris secara unik. Meskipun untuk itulah kunci primer diperuntukkan, itu tidak selalu mensyaratkan keberadaan kunci primer. Menambahkan kunci utama ke setiap tabel bukan praktik yang buruk karena memberikan identifikasi baris yang unik, tetapi mungkin tidak perlu.
Untuk menjaga hubungan yang andal antara baris dua atau lebih tabel, Anda perlu melakukannya melalui kunci asing, karenanya kebutuhan untuk kunci utama di setidaknya beberapa tabel. Menambahkan kunci utama ke setiap tabel memudahkan untuk memperluas desain database Anda ketika tiba saatnya untuk menambahkan tabel baru atau hubungan ke data yang ada. Perencanaan ke depan selalu merupakan hal yang baik.
Sebagai prinsip dasar (aturan keras mungkin), nilai kunci primer tidak boleh berubah sepanjang umur barisnya. Adalah bijaksana untuk mengasumsikan bahwa data bisnis apa pun secara berurutan dapat berubah sepanjang hidupnya, sehingga data bisnis apa pun akan menjadi kandidat yang buruk untuk kunci utama. Inilah sebabnya mengapa sesuatu yang abstrak seperti bilangan bulat yang ditambahkan secara otomatis seringkali merupakan ide yang bagus. Namun, bilangan bulat yang bertambah secara otomatis memang memiliki keterbatasan.
Jika data Anda hanya akan memiliki kehidupan dalam database Anda, bilangan bulat yang ditambahkan secara otomatis baik-baik saja. Tetapi, seperti yang telah disebutkan dalam jawaban lain, jika Anda ingin data Anda dibagikan, disinkronkan, atau memiliki kehidupan di luar basis data Anda, bilangan bulat yang bertambah secara otomatis membuat kunci utama yang buruk. Pilihan yang lebih baik adalah panduan (alias uuid "id unik universal").
sumber
Pertanyaan, dan banyak jawaban, kehilangan poin penting bahwa semua kunci alami untuk setiap tabel berada hanya dalam skema logis untuk database, dan semua kunci pengganti untuk setiap tabel berada hanya dalam skema fisik untuk database. jawaban lain hanya membahas manfaat relatif kunci pengganti bilangan bulat versus GUID, tanpa membahas alasan mengapa kunci pengganti digunakan dengan benar, dan kapan.
BTW: Mari kita hindari penggunaan kunci primer istilah yang tidak jelas dan tidak tepat . Ini adalah artefak dari model data pra-relasional yang pertama kali dikooptasi (secara tidak bijaksana) ke dalam model relasional, dan kemudian dikooptasi kembali ke domain fisik oleh berbagai vendor RDBMS. Penggunaannya hanya untuk membingungkan semantik.
Perhatikan dari model relasional bahwa, agar skema logis database berada dalam bentuk normal pertama , setiap tabel harus memiliki kumpulan bidang yang terlihat oleh pengguna, yang dikenal sebagai kunci alami, yang secara unik mengidentifikasi setiap baris tabel. Dalam kebanyakan kasus kunci alami seperti itu mudah diidentifikasi, tetapi kadang-kadang seseorang harus dibangun, apakah sebagai bidang pemutus dasi atau sebaliknya. Namun kunci yang dikonstruksi seperti itu selalu tetap terlihat oleh pengguna, dan dengan demikian selalu berada dalam skema logis dari database.
Sebaliknya setiap kunci pengganti di atas meja berada murni dalam skema fisik untuk basis data (dan karenanya harus selalu, baik karena alasan keamanan dan untuk pemeliharaan integritas basis data, sepenuhnya tidak terlihat oleh pengguna basis data). Satu-satunya alasan untuk memperkenalkan kunci pengganti adalah untuk mengatasi masalah kinerja dalam pemeliharaan fisik dan penggunaan DB; apakah itu gabungan, replikasi, beberapa sumber perangkat keras untuk data, atau lainnya.
Karena satu-satunya alasan untuk memperkenalkan kunci pengganti adalah kinerja, marilah kita menganggap bahwa kita ingin itu menjadi penampil. Jika masalah kinerja yang dihadapi adalah bergabung, maka kami tentu ingin membuat kunci pengganti kami sesempit mungkin (tanpa menghalangi perangkat keras, sehingga bilangan bulat pendek dan byte biasanya keluar). Kinerja gabungan bergantung pada tinggi indeks minimal, sehingga integer 4-byte adalah solusi alami. Jika masalah kinerja Anda adalah tingkat penyisipan, integer 4-byte juga dapat menjadi solusi alami (tergantung pada internal RDBMS Anda). Jika masalah kinerja Anda untuk tabel adalah replikasi atau beberapa sumber data dibandingkan beberapa teknologi kunci pengganti lainnya , baik itu GUID atau kunci dua bagian (Host ID + integer) mungkin lebih cocok. Saya pribadi bukan favorit GUID tetapi nyaman.
Singkatnya, tidak semua tabel akan membutuhkan kunci pengganti (jenis apa pun); mereka hanya boleh digunakan jika dianggap perlu untuk kinerja tabel yang sedang dipertimbangkan. Terlepas dari teknologi pengganti mana yang Anda sukai, pikirkan baik-baik tentang kebutuhan sebenarnya dari tabel sebelum membuat pilihan; mengubah pilihan teknologi kunci pengganti untuk sebuah meja akan sangat melelahkan. Dokumentasikan metrik kinerja utama untuk meja Anda sehingga penerus Anda akan memahami pilihan yang dibuat.
Kasus khusus
Jika persyaratan bisnis Anda mengamanatkan penomoran berurutan transaksi untuk keperluan audit (atau lainnya) daripada bidang itu bukanlah kunci pengganti; itu adalah kunci alami (dengan persyaratan tambahan). Dari dokumentasi, integer peningkatan-otomatis hanya menghasilkan kunci pengganti , jadi temukan mekanisme lain untuk membuatnya. Jelas beberapa jenis monitor akan diperlukan, dan jika Anda mengambil sumber transaksi Anda dari beberapa situs maka satu situs akan istimewa , berdasarkan menjadi situs host yang ditunjuk untuk monitor.
Jika meja Anda tidak akan pernah lebih dari sekitar seratus baris, maka tinggi indeks tidak relevan; setiap akses akan dilakukan dengan pemindaian tabel. Namun perbandingan string pada string panjang masih akan jauh lebih mahal daripada perbandingan integer 4-byte, dan lebih mahal daripada perbandingan GUID.
Tabel nilai kode yang dikunci oleh bidang kode char (4) harus sama performannya dengan yang memiliki bilangan bulat 4-byte. Meskipun saya tidak punya bukti tentang ini, saya sering menggunakan asumsi ini dan tidak pernah punya alasan untuk menyesalinya.
sumber
Bukan hanya itu bukan praktik yang baik, pada kenyataannya itu digambarkan sebagai anti-pola dalam buku Antiperner SQL karya Bill Karwin.
Tidak setiap tabel membutuhkan pseudokey - kunci utama dengan nilai arbitrer, bukan sesuatu yang memiliki nilai semantik untuk model -, dan tidak ada alasan untuk selalu menyebutnya
id
.sumber
Ini cukup universal - jika tidak, Anda perlu memvalidasi bahwa kuncinya sebenarnya unik. Ini akan dilakukan dengan melihat semua kunci lain ... yang akan memakan waktu. Memiliki kunci tambahan menjadi mahal karena nomor catatan Anda mendekati nilai overflow kunci.
Saya biasanya membuat pointer nama bidang lebih jelas seperti
ref_{table}
atau ide serupa.Jika tidak perlu untuk menunjuk ke catatan maka Anda tidak perlu id.
sumber
unsigned int
untuk jenis bidang jika batasnya adalah setengah dari angka itu.Saya tidak akan mengatakan itu harus selalu dilakukan. Saya punya meja di sini tanpa kunci unik - dan tidak perlu. Ini adalah log audit. Tidak akan pernah ada pembaruan, kueri akan mengembalikan semua perubahan ke apa yang sedang dicatat tetapi itu adalah yang terbaik yang dapat dilakukan secara wajar. Perlu manusia untuk mendefinisikan perubahan yang salah. (Jika kodenya bisa, itu tidak diizinkan di tempat pertama!)
sumber
Penghitung kenaikan otomatis untuk kunci utama bukan ide yang baik. Itu karena Anda harus kembali ke database untuk menemukan kunci berikutnya dan ditambahkan satu per satu sebelum memasukkan data Anda.
Bahwa menjadi kata saya biasanya akan menggunakan apa pun yang dapat menyediakan database untuk kunci utama daripada memilikinya sebagai bagian dari aplikasi.
Dengan membiarkan database menyediakannya untuk Anda, ia dapat menjamin kunci untuk menjadi unik untuk apa yang dibutuhkannya.
Tentu saja tidak semua database mendukungnya. Dalam hal ini saya biasanya menggunakan tabel yang menyimpan ember kunci dan menggunakan rentang tinggi dan rendah yang dikelola dalam aplikasi. Ini adalah solusi paling berkinerja yang saya temukan karena Anda mendapatkan kisaran 10.000 nomor dan secara otomatis menambahnya pada contoh aplikasi. Contoh aplikasi lain dapat mengambil ember nomor lain untuk digunakan. Anda memang membutuhkan kunci primer primitif yang cukup besar seperti panjang 64-bit.
UUID Saya tidak menggunakan sebagai kunci utama karena biaya membangun dan menyimpannya jauh lebih tinggi daripada menambah nilai yang panjang satu per satu. UUID masih berurusan dengan paradoks ulang tahun di mana duplikat secara teoritis dapat muncul.
sumber