Mengapa awalan nama kolom dianggap praktik buruk?

25

Menurut posting SO populer itu dianggap praktik yang buruk untuk awalan nama tabel. Di perusahaan saya setiap kolom diawali dengan nama tabel. Ini sulit bagi saya untuk membaca. Saya tidak yakin alasannya, tetapi penamaan ini sebenarnya adalah standar perusahaan. Saya tidak tahan dengan konvensi penamaan, tetapi saya tidak memiliki dokumentasi untuk mendukung alasan saya.

Yang saya tahu adalah bahwa membaca AdventureWorks jauh lebih sederhana. Dalam hal ini perusahaan kami DB Anda akan melihat tabel, Person dan mungkin memiliki nama kolom:

Person_First_Name
atau mungkin bahkan
Person_Person_First_Name (jangan tanya saya mengapa Anda melihat orang 2x)

Mengapa dianggap praktik yang buruk untuk melakukan pra-perbaiki nama kolom? Apakah garis bawah juga dianggap jahat di SQL?


Catatan: Saya memiliki Pro SQL Server 2008 - Desain dan implementasi Database Relasi. Referensi untuk buku itu dipersilakan.

P.Brian.Mackey
sumber
2
Sepertinya siapa yang membuat aturan ini tidak mengetahui fungsi aliasing.
ba__friend
@ Daniel Pryden - Saya menggunakan kata-kata yang buruk. Pertanyaan diperbarui.
P.Brian.Mackey
Jenis posting serupa di sini stackoverflow.com/questions/465136/…
@ba__friend - Bisakah Anda memberi saya detail tentang komentar itu?
P.Brian.Mackey
1
Kata penting yang Anda gunakan adalah Standar. Jika Anda mengubah praktik standar, Anda memiliki inkonsistensi. Apakah Anda secara jujur ​​merasa bahwa ada perubahan dari praktik standar ini, sepadan dengan ketidakkonsistenan yang dihasilkan? Apakah status-quo benar-benar lebih buruk dari itu?

Jawaban:

44

Garis bawah bukan kejahatan, hanya sulit untuk diketik. Yang buruk adalah mengubah standar midstream tanpa memperbaiki semua objek yang ada. Sekarang Anda memiliki personId, Person_id, dll. Dan tidak dapat mengingat tabel mana yang menggunakan garis bawah atau tidak. Konsistensi dalam penamaan (bahkan jika Anda secara pribadi tidak menyukai nama-nama) membantu membuatnya lebih mudah dikodekan.

Secara pribadi, satu-satunya tempat yang saya rasa perlu menggunakan tablename dalam sebuah kolom adalah pada kolom ID (penggunaan just ID adalah antipattern dalam desain basis data seperti yang dapat diberitahukan kepada siapa pun yang telah melakukan kueri pelaporan yang luas. Sangat menyenangkan untuk mengubah nama 12 kolom dalam kueri Anda setiap kali Anda menulis laporan.) Itu juga membuatnya lebih mudah untuk segera mengetahui FK di tabel lain karena mereka memiliki nama yang sama.

Namun, dalam database yang matang, itu lebih berfungsi daripada layak untuk mengubah standar yang ada. Terima saja itu adalah standar dan terus maju, ada jauh lebih banyak hal kritis yang perlu diperbaiki terlebih dahulu.

HLGEM
sumber
4
Benar, tetapi database tanpa standar penamaan yang konsisten jauh lebih sulit untuk ditanyakan daripada yang dengan standar buruk yang diterapkan secara konsisten.
HLGEM
2
Saya sebagian setuju. Jika databasenya BESAR maka pertahankan standarnya. Tapi saya menghabiskan waktu saya membaca kode lebih dari menulisnya dan awalan nama tabel sepertinya lebih berisik untuk menyaring. Jika itu saya dan saya tahu saya bisa memperbaikinya dalam beberapa hari atau seminggu saya yakin akan melakukannya. Tetapi banyak waktu Anda tidak memiliki kemewahan itu dan harus terus coding prodution, prodution, prodution.
programmer
3
@ alasan, Anda mungkin melanggar lebih dari yang Anda pikirkan melakukan itu. Database sering diakses oleh banyak hal yang tidak disadari oleh programmer aplikasi. Hal-hal seperti impor data dari klien atau dbs lain dan ekspor ke klien dan atau gudang data, aplikasi lain, laporan, dll. Anda dapat membiasakan diri membaca standar apa pun dalam hitungan jam, dan refactoring jauh dari standar perusahaan yang disetujui tanpa perjanjian untuk pindah ke standar baru akan membuat Anda memecat sebagian besar tempat. Jujur saja, kecuali basis datanya masih dalam masa pertumbuhan, lebih baik menggunakan standar yang ada apakah Anda suka atau tidak.
HLGEM
7
@Jason, saya orang basis data, kami dikenal luas karena tidak memiliki rasa petualangan!
HLGEM
2
Sepenuhnya setuju dengan TableName. Saya menjadi antipattern. Telah bekerja di dalam dan tanpa pola yang cukup lama bahwa saya confidentelly bisa mengatakan kesalahan / kebingungan terjadi dengan TableName.Id yang tidak terjadi dengan TableName.TableNameId
AaronLS
16

Argumen untuk awalan nama kolom akan mencegah nama "tabrakan" ketika bergabung dengan beberapa tabel DAN ketika pembuat kueri tidak menggunakan alias.

SELECT person.name, company.name FROM person JOIN company ON ...

SELECT * FROM person JOIN company ON ...

Kedua kueri akan memiliki dua kolom "nama" ( name_1, name_2 ) tanpa "memberi tahu" ke entitas mana itu berada. Dan Anda tidak pernah bisa yakin dengan nama kolom yang dihasilkan (apakah itu name_2 atau name_3 atau ...). Jika Anda menggunakan nama tabel awalan, nama kolom akan PERSON_NAME , COMPANY_NAME sehingga Anda tahu setiap nama yang mana entitas itu milik, ditambah Anda tahu bahwa nama kolom akan tetap konstan (jika Anda mendapatkan mereka di Jawa menggunakan JDBC misalnya ).

Kedua argumen dapat diabaikan jika Anda menggunakan aliasing, tapi saya pikir sebagian besar konvensi pengkodean yang diberlakukan di perusahaan datang sebagai konsekuensi dari banyak (junior) programmer tidak mengikuti praktik yang baik. Dalam kasus ini, misalnya, menggunakan wildcard pada pernyataan SELECT dapat menyebabkan masalah tanpa awalan nama.

Sedangkan untuk garis bawah pada nama tabel dan kolom, saya menggunakannya secara luas karena saya hanya menggunakan huruf kecil dalam nama plus garis bawah sebagai pemisah. Hanya menggunakan huruf kecil membantu membedakan pengidentifikasi dari kata kunci SQL (yang saya ketik di semua huruf besar):

SELECT person_name, COUNT(bought_product) FROM bought_products WHERE person_name LIKE 'A%'
Nicolae Albu
sumber
6
Saya akan senang jika semua kolom dengan informasi yang sama di tabel yang berbeda akan memiliki nama yang persis sama dan bahwa setiap kali Anda menggunakan lebih dari 1 tabel alias akan menjadi standar yang ditegakkan. Cukup lelah mengingat tabel mana yang sabar, sabar, pat_id, id_pat, atau peta ptatient_id.
Pieter B
1
Saya tidak pernah menulis permintaan produksi tanpa alias semua kolom. Itu membuat maintenace jauh lebih mudah. Tentu saja saya menulis permintaan jenis pelaporan / ekspor yang rumit dengan hingga 10-20 bergabung dan 30-50 kolom dan enam bulan kemudian sulit untuk mengingat dari tabel mana kolom itu berasal.
HLGEM
8

Menambahkan awalan semacam itu ke nama kolom akan membuat tabel lebih sulit untuk berkembang. Sebagai contoh: jika pada akhirnya Anda menyadari bahwa Anda ingin / perlu mengubah nama tabel, Anda harus mengubah seluruh struktur tabel Anda (yaitu, tidak hanya nama tabel, tetapi nama semua kolomnya). Ini juga akan membuat lebih sulit memperbarui indeks tabel dan kode klien yang menanyakannya.

Sergio
sumber
4

Ada pengecualian jika digunakan secara bijak (sesuai jawaban Patrick Karcher di tautan Anda) untuk nama kolom umum (biasanya hanya ID, kadang-kadang Nama) yang terlalu sering ambigu .

Praktik terbaik lainnya adalah selalu memenuhi syarat kolom dan objek di kueri Anda. Jadi awalan kolom menjadi diperdebatkan dan mengacaukan kode Anda.

Bandingkan ini: mana yang paling mudah dilihat?

SELECT P.name, P.Salary FROM dbo.Person P

SELECT Person.Name, Person.Salary FROM dbo.Person Person

SELECT dbo.Person.name, dbo.Person.Salary FROM dbo.Person

SELECT Person.Person_name, Person.Person_Salary FROM dbo.Person Person
gbn
sumber
3
Pasti yang pertama ... :)
ErikE
3
Bagaimana dengan SELECT name, salary FROM dbo.Person? : P
cHao
1
@ cHao: coba buat tampilan DENGAN PEMASANGAN pada ...
gbn
@ GBN: Bekerja dengan baik untuk saya. CREATE VIEW [dbo].[vwMeritPercentage] with schemabinding AS SELECT [Performance Score] as dblMinScore, ISNULL(( SELECT TOP 1 [Performance Score] FROM dbo.Budget b WHERE b.[Performance Score] > budget.[Performance Score] ORDER BY [Performance Score] ), 100.00) as dblMaxScore, [Merit Minimum] as dblMinPercentage, [Merit Midpoint] as dblBudgetPercentage, [Merit Maximum] as dblMaxPercentage FROM dbo.Budget;
cHao
1
Dokumentasi yang relevan ( msdn.microsoft.com/en-us/library/ms187956(v=SQL.105).aspx ): "Ketika Anda menggunakan SCHEMABINDING, select_statement harus menyertakan nama dua bagian (schema.object) dari tabel, tampilan, atau fungsi yang ditentukan pengguna yang direferensikan. " Perhatikan bahwa kolom tidak memerlukan nama bertitik (kecuali jika diminta untuk menyelesaikan ambiguitas dalam kueri) ... ... hanya tabel, tampilan, dan fungsi.
cHao
3

Secara umum, sepertinya tidak ada standar di mana-mana. Pertanyaan yang Anda tautkan memiliki beberapa jawaban pilihan tinggi dengan konvensi yang sama sekali berbeda. Tentu saja, semua orang akan mempertahankan standar mereka sendiri, dan jauh lebih penting untuk menjaga konvensi yang konsisten dalam suatu proyek.

Yang mengatakan, nama kolom awalan tampaknya terlalu banyak. Anda sudah tahu tabel apa yang Anda gunakan, dan situasi dengan dua kolom dari tabel yang berbeda dengan nama yang sama dapat dengan mudah diselesaikan dengan menggunakan alias tabel atau kolom.

Dan Simon
sumber
2

Di TSQL Anda bisa merujuk ke bidang dalam bentuk TableName.FieldName jika Anda ingin menghindari ambiguitas sehingga menambahkan nama tabel ke nama bidang benar-benar menghilangkan keterbacaan membuatnya TableName.TableName_FieldName atau serupa. Saya pikir menggunakan garis bawah atau bukan lebih merupakan pilihan pribadi. Saya lebih suka CamelCase dan saya menggunakan _ ketika saya ingin menambahkan akhiran atau sejenisnya misalnya TableName_Temp, tapi itu hanya saya.

Ben Robinson
sumber
2

Saya pernah bekerja pada sistem di mana kami memutuskan untuk menggunakan kode pendek untuk awalan kolom. Bidang PK menggunakan "nama tabel lengkap" sebagai awalan, dan semua kolom lainnya menggunakan 2-4 karakter secara konsisten sebagai awalannya. Setiap kolom juga menggunakan domain data sebagai sufiksnya. Jika dilakukan secara konsisten, itu bisa sangat bagus dan bersih. Itu omong kosong bahwa standar penamaan dari satu jenis atau yang lain melibatkan pengkodean ceroboh. Kehadiran standar yang konsisten adalah yang penting. Saya telah melihat sejumlah database yang tidak konsisten karena tidak ada standar yang jelas, dan bahwa lebih dari apa pun akan menunjukkan kepada saya bahwa mungkin ada masalah dalam struktur data. Jika perancang database bahkan tidak dapat secara konsisten memberi nama objek dan anak-anak mereka,

Tom
sumber
1

Awalan adalah praktik buruk karena menyebabkan masalah yang dirancang untuk mencegahnya. Seperti yang Anda nyatakan, sangat sulit untuk membaca kolom awalan. Jika Anda berakhir dengan nama kolom duplikat dalam kueri tempat Anda bergabung dengan dua tabel, Anda bisa mengatasinya, atau merupakan tampilan, prosedur tersimpan atau fungsi yang ditentukan pengguna tabular yang melakukannya untuk Anda jika Anda terus-menerus bergabung dengan tabel tertentu.

Sejauh menggunakan menggarisbawahi dalam nama tabel, itu adalah argumen agama. Pada akhirnya jika meningkatkan visibilitas dan membuat segalanya menjadi lebih mudah. Saya biasanya tidak akan memiliki spasi atau tabel dalam kolom atau nama tabel. Namun, saya dapat membuat pengecualian untuk tabel atau tampilan yang hanya digunakan oleh paket pelaporan, atau diekspor ke file CSV.

Justin Dearing
sumber
1

Banyak database memiliki batasan ketat pada jumlah karakter dalam nama kolom (yaitu Oracle).

Jika Anda bekerja dengan database yang memungkinkan nama kolom panjang, tetapi Anda kemudian memutuskan bahwa Anda ingin memigrasi struktur itu ke sistem database lain, awalan akan meningkatkan kemungkinan nama kolom Anda tidak valid.

Meskipun Anda bekerja dengan SQL Server sekarang, tidak ada yang bisa memprediksi masa depan, dan mungkin saja perangkat lunak Anda mungkin harus bekerja pada banyak basis data di masa depan.

Britt Wescott
sumber
0

Pertimbangkan untuk menulis kamus data (atau "registri"). Maksud saya dokumen yang berisi semua elemen data dalam model Anda: nama, deskripsi, dll. Itu harus independen dari implementasi model misalnya tidak harus menyebutkan nama tabel. Bagaimana Anda menyatukan nama seperti 'ID', 'Type' dan 'Code'?

Salah satu pendekatan adalah mengikuti pedoman standar internasional ISO / IEC 11179 - setelah semua, mengapa menciptakan kembali kemudi? Struktur dasarnya adalah:

[Object] [Qualifier] Property RepresentationTerm

dengan pembatas di antara elemen-elemen: SQL tidak bermain bagus dengan spasi dalam nama kolom dan garis bawah bekerja dengan baik secara visual.

Saya merasa bahwa seseorang di organisasi Anda mencoba mengikuti panduan ini ketika mereka muncul dengan nama elemen seperti Person_Person_First_Name.

Contoh yang ingin saya tampilkan adalah kamus data Layanan Kesehatan Bangsa Inggris (NHS) .

Jadi saya tidak berpikir konvensi penamaan yang Anda harus kerjakan dengan suara terlalu buruk.

Pada implementasi misalnya dalam SQL, beberapa orang suka menghilangkan sub-elemen Objek, Kualifikasi dan Properti ketika nama tabel memberikan konteks misalnya person_first_namemenjadi first_namedalam Persontabel dll. Namun, aturan praktis bahwa elemen data tidak boleh mengubah namanya hanya karena lokasi itu dalam model fisik sepertinya bagus. Siapa pun yang berpikir itu bukan ide yang baik untuk mengikuti aturan ini harus diberi tugas mendokumentasikan semua variasi nama yang telah mereka gunakan :)

Anda akan menemukan ringkasan bagus ISO 11179 dalam buku Gaya Pemrograman Joe Celko , termasuk bukti untuk lebih memilih garis bawah sebagai pembatas dalam nama kolom.

suatu hari nanti
sumber
0

Beberapa merasa lebih mudah dalam kode untuk mengetahui dari mana tabel data berasal, namun, jika Anda berbicara tentang sistem berorientasi objek Anda harus menggunakan konteks nama untuk mengetahui dari mana asalnya, dalam hal ini nama tabel.

Secara pribadi, awalan nama tabel merupakan indikasi bahwa para pengembang tidak terlalu ahli dan ketika Anda menggali lebih dalam, Anda akan menemukan banyak konvensi pengkodean yang buruk lainnya dan jika saya harus menebak aplikasinya memiliki terlalu banyak tabel, buggy, dll.

Bill Leeper
sumber