Saya dulu memberi label pada kolom di basis data saya seperti ini:
user_id
user_name
user_password_hash
Untuk menghindari konflik ketika bergabung dengan dua tabel, tetapi kemudian saya belajar lebih banyak tentang cara membuat tabel, dan saya berhenti melakukan ini.
Apa cara yang efektif untuk memberi label pada kolom dalam basis data? Mengapa?
database-design
erd
Thomas O
sumber
sumber
Jawaban:
Dalam kasus Anda, pengguna awalan berlebihan. Kami (pengembang yang bertanggung jawab) tahu bahwa ini adalah pengguna tabel, jadi mengapa menambahkan
user_
awalan di depan setiap bidang?Apa yang saya sarankan kepada Anda adalah melakukannya dengan pendekatan yang lebih alami.
Apa karakteristik seseorang: Nama Belakang, Nama Depan, Tanggal Lahir, Kebangsaan, dll ...
Apa karakteristik dari Mobil: Model, Tahun, Warna, Energi, dll ...
Kolom Anda harus dinamai sealami mungkin, itu akan membuat skema lebih jelas untuk semua orang, untuk Anda dan yang datang setelah Anda. Ini juga disebut fase Pemeliharaan, dan apa pun yang dapat Anda lakukan untuk membuat pemeliharaan lebih mudah biasanya sepadan dengan usaha.
sumber
Selain komentar Spredzy, beri label kunci utama Anda sama (ID) sehingga ketika Anda menulis pertanyaan dengan cepat, Anda dapat dengan mudah mengingat (u.ID = c.ID) daripada harus mencari "Apakah itu countryID , country_ID, countries_ID, countriesID,? "
sumber
USING
klausa SQL (itu bertentangan dengan spesifikasi).Saya sangat setuju dengan tambahan David Hall untuk jawaban Spredzy yang luar biasa. Sederhana dan alami adalah cara untuk pergi. Kebingungan tabel seharusnya tidak menjadi masalah jika Anda memberi nama tabel secara alami juga.
Tidak masuk akal memiliki users.user_id dan cars.car_id ketika Anda bisa memiliki users.id dan cars.id
sumber
Saya berpendapat bahwa dalam skema database, setiap kolom harus memiliki nama yang unik, di seluruh tabel. Ada beberapa alasan untuk itu:
Dari sudut pandang pemodelan: Anda mulai dengan sup atribut dan Anda menormalkannya ke dalam tabel. Seiring waktu, Anda mungkin mendenormalisasi atau menormalkan lebih lanjut atau memperkenalkan pandangan atau pandangan terwujud, atau memperkenalkan tabel baru. Ini tidak pernah menjadi masalah jika semua nama kolom unik.
Anda dapat menggunakan ini bergabung sintaks:
a JOIN b USING (a_id) JOIN c USING (a_id)
. Sangat nyaman dan juga membantu dengan poin berikut.Jika Anda menjalankan kueri dengan banyak gabungan atau membuat tampilan terwujud dengan
SELECT *
, Anda tidak akan pernah (yah, mungkin jarang) memiliki konflik. Pikirkan tentang bergabungperson.name
,product.name
,country.name
, dll Urgh.Secara umum, jika Anda memiliki pertanyaan besar, sulit untuk melacak apa
id
artinya di mana-mana.sumber
Mari kita lihat, dengan contoh Anda akan terlihat seperti ini:
Saya menggunakan nama tabel dalam huruf besar. Ini memungkinkan saya mengidentifikasi tabel dengan mudah. Kolom yang baru saya beri nama adalah masing-masing untuk apa yang diwakilinya. Saya mencoba untuk tidak menggunakan angka atau memasukkan awalan atau akhiran dengannya. Ini akan membuat kueri mati sederhana dan sangat mudah.
BTW, saya pikir Anda harus menemukan beberapa gaya yang Anda sukai dan tetap menggunakannya. Jika Anda sering mengubahnya, maka Anda akan memiliki skema DB yang berantakan.
sumber
Seperti yang lain, saya sarankan Anda tidak memasukkan nama tabel sebagai bagian dari kolom. Kecuali jika Anda memiliki ratusan tabel semua dengan nama kolom yang hampir sama: jika Anda memiliki beberapa lusinan tabel semua dengan kolom berjudul ID, maka tentu saja awali mereka dengan nama tabel.
Saya baru-baru ini meninggalkan perusahaan di mana salah satu pengembang lebih suka awalan kolom kunci utama dan kunci asing dengan pk dan fk. Ini mengarah ke beberapa kekejian di mana kolom dimulai dengan pkfk (biasanya kunci primer komposit berdasarkan 2 kolom, di mana satu kolom adalah kunci asing ke tabel lain).
sumber
Saya bekerja di lingkungan di mana setiap nama kolom dimulai dengan awalan yang berasal dari nama tabel, itu bukan penemuan saya, tapi saya cukup senang dengannya.
Idealnya, nama kolom unik untuk semua tabel dalam database.
Beberapa pengamatan:
Gagasan umum: Yang paling penting adalah konsistensi dari setiap konvensi penamaan: - tunggal vs jamak (ok yang berlaku untuk tabel dan bukan kolom) - mengidentifikasi kunci utama dan asing (mereka membangun struktur vs isi database) - konsisten ketika Anda menyimpan string dan varian pendek dari string yang sama - konsisten dengan flag, status, dll.
sumber
Saya setuju dengan jawaban Spredzy tetapi akan menambahkan bahwa sebagai pilihan saya akan menggunakan camelCase daripada under_score.
firstName, lastName dll.
sumber
Dalam kasus Oracle, Anda akan ingin tidak nama kolom 'id' atau 'name' atau apa pun yang generik.
Masalahnya adalah bahwa secara default di versi yang lebih lama , Oracle akan mencoba untuk bergabung dengan tabel berdasarkan nama kolom yang sama, jadi jika saya telah menamai semuanya dengan baik, maka saya juga akhirnya menentukan klausa gabungan default di antara tabel saya.
Tetapi bahkan jika Anda tidak menggunakan Oracle, dengan tidak memilih nama yang muncul dalam beberapa tabel, itu juga berarti bahwa Anda tidak harus melalui masalah peng aliasing setiap kali Anda harus melakukan pemilihan di dua tabel:
Jadi, jika pilihan multi-tabel adalah norma, nama kolom yang lebih lama menghemat Anda mengetik. (jika Anda hanya menggunakan satu tabel pada satu waktu ... apakah Anda benar-benar membutuhkan database relasional?)
... dan penghematan pengetikan membawa kita ke masalah lain di Oracle - setidaknya dalam 8i (versi saat ini ketika saya mengambil kursus Oracle SQL Tuning dan Pemodelan Data) caching rencana eksekusi hanya didasarkan pada begitu banyak karakter pertama dari kueri (tidak dapat mengingat nilai pastinya ... 1024?), jadi jika Anda memiliki kueri yang hanya bervariasi menurut sesuatu di akhir klausa di mana, dan daftar kolom yang Anda ekstraksi sangat panjang, Anda dapat mengalami hit kinerja karena tidak dapat men-cache rencana eksekusi dengan benar.
Oracle memiliki panduan dalam memilih apa yang mereka klaim adalah nama tabel dan kolom yang baik, yang pada dasarnya adalah panduan untuk menghapus huruf sampai sekitar 5-8 karakter, tetapi saya tidak pernah terlalu memperhatikannya.
...
Yang terjadi selain itu:
pembaruan : bagi mereka yang tidak terbiasa dengan perilaku bergabung Oracle, lihat contoh terakhir tentang Menguasai Oracle SQL: Gabung Ketentuan , di mana disebutkan:
Di bawah 'old join syntax' (8i dan sebelumnya), 'NATURAL JOIN' adalah perilaku join default, dan saya yakin itu masih terjadi jika Anda tidak menentukan kondisi join. Setelah 'NATURAL JOIN' adalah opsi resmi di 9i, rekomendasi umum adalah jangan menggunakannya , karena penamaan kolom yang buruk dapat mengacaukan Anda, yang mana saya menganjurkan nama kolom yang bagus.
sumber
NATURAL JOIN
deterministik.cross join
adalah, tadinya dan akan selalu menjadi 'default'. Oracle tidak pernah cocok dengan nama kolom kecuali jikanatural join
secara eksplisit digunakan"
karena dengan melakukan itu, Anda menimpa case-fold asli dari database. SQL spec menuntut semua pengidentifikasi dilipat ke huruf besar. Beberapa database, seperti PostgreSQL, melipatnya menjadi huruf kecil. Jika tidak ada yang dikutip, ini akan bekerja di semua database dan mereka dapat melipatnya ke spec atau default khusus rdbms._
), karena seperti di atas - Anda tidak boleh menggunakan camelCase.gunakan
{entity}_id
untuk id (dan kunci asing yang menunjuk ke id itu). Karena dengan begitu Anda dapat menggunakanUSING
klausa. Nama-nama kunci unik-global yang digunakan dalam kondisi gabungan adalah konvensi yang ditetapkan dalam spesifikasi.sumber