Sütun adlarının ön ekini neden kötü bir uygulama olarak kabul ediyor?


25

Popüler bir SO yazısına göre, tablo adlarını öneklemek için kötü bir uygulama olarak kabul edilir. Benim şirketimde her sütuna bir tablo adı eklenmiştir. Bu benim okumam için zor. Sebebini bilmiyorum ama bu isimlendirme aslında şirket standardı. Adlandırma kurallarına tahammül edemiyorum, ancak gerekçemi desteklemek için hiçbir belgem yok.

Tek bildiğim, AdventureWorks'ü okumanın çok daha kolay olduğu. Gelen bu şirketimizin DB Eğer bir tablo göreceksiniz, Kişi ve sütun adını olabilir:

Person_First_Name
veya hatta
Person_Person_First_Name (2x kişiyi neden gördüğünü sorma)

Sütun adlarını önceden belirlemek neden kötü bir uygulama olarak kabul edilir? Alt çizgi SQL'de de kötü sayılıyor mu?


Not: Pro SQL Server 2008 - İlişkisel Veri Tabanı tasarımı ve uygulamasına sahibim. Bu kitaba yapılan referanslar açıktır.


2
Görünüşe göre bu kuralları kim takma islevinin farkında değildi.
ba__friend 20:11

@ Daniel Pryden - Kötü ifadeler kullandım. Soru güncellendi.
P.Brian.Mackey

Benzer bir gönderi burada stackoverflow.com/questions/465136/…

@ba__friend - Bu yorumla ilgili bana biraz detay verebilir misiniz?
P.Brian.Mackey

1
Kullandığınız temel kelime Standart. Standart bir uygulamayı değiştirirseniz tutarsızlığa sahipsiniz. Dürüst olmak gerekirse, bu standart uygulamadaki herhangi bir değişikliğin tutarsızlığa neden olduğuna değdiğini düşünüyor musunuz? Statüko gerçekten bundan daha mı kötü?

Yanıtlar:


44

Alt çizgi yazmak zor değil. Kötü olan, mevcut tüm nesneleri sabitlemeden ortadaki standartları değiştirmektir. Şimdi personId, Person_id vb. Öğelerine sahipsiniz ve hangi tablonun alt çizgi kullanıp kullanmadığını hatırlayamıyorsunuz. İsimlendirmedeki tutarlılık (isimleri kişisel olarak sevmeseniz bile) kodlamayı kolaylaştırır.

Şahsen bir tablindeki bir tablodaki adı kullanmak zorunda olduğumu hissettiğim tek yer, ID sütununda (sadece ID kullanımı, geniş kapsamlı raporlama sorguları yapan herkesin size söyleyebileceği gibi, veritabanı tasarımında bir kaynaştırıcıdır. Yeniden adlandırmak çok eğlencelidir. Her rapor yazışınızda sorgunuzda 12 sütun bulunur.) Bu aynı zamanda diğer tablolardaki FK'ları aynı ada sahip oldukları gibi hemen tanımayı da kolaylaştırır.

Ancak, olgun bir veritabanında, mevcut bir standardı değiştirmeye değdiğinden çok daha fazla iş vardır. Sadece bunun standart olduğunu kabul edin ve devam edin, ilk önce düzeltilmesi gereken çok daha kritik şeyler var.


4
Doğru, ancak tutarlı bir adlandırma standardı olmayan bir veritabanının, tutarlı bir şekilde uygulanan kötü bir standardın bulunduğu bir sorgudan daha zordur.
HLGEM

2
Kısmen katılıyorum. Veritabanı BÜYÜK ise, standart tutmak. Ancak zamanımı kod yazmaktan daha fazla okudum ve tablo adı önekleri elemek için daha fazla gürültü gibi görünüyor. Ben olsaydım ve birkaç gün ya da bir hafta içinde onu yeniden yaratabileceğimi bilseydim, eminim. Fakat çok fazla zamanınız bu lüksünüz yok ve kodlama prodution, prodution, prodution tutmak zorundasınız.
programcı

3
@ jason, düşündüğünden daha fazlasını kırabilirsin. Veritabanlarına genellikle uygulama programcısının bilmediği birçok şey erişir. Müşterilerden veya diğer db'lerden veri ithalatı ve müşterilere ve / veya datawarehouse'lara, diğer uygulamalara, raporlara, vb. İhraç eder. yeni bir standarda geçmek çoğu yerden kovulmanıza neden olur. Açıkçası, veritabanı başlangıçta olmadıkça, beğenmek ya da beğenmemek, mevcut standardı kullanmak daha iyidir.
HLGEM

7
@ Jason, ben bir veritabanı kişisiyim, macera duygusu olmadığı biliniyor!
HLGEM

2
TableName ile tamamen katılıyorum. Bir antipattern olmak. İçinde ve yeterince uzun ben confidentelly hataları söyleyebiliriz o desen olmadan çalıştınız mı / karışıklık TableName.TableNameId meydana kalmamasıdır TableName.Id ile gerçekleşir
AaronLS

16

Sütun adı ön eki için bir argüman, birden fazla tabloya katılırken ve "sorgu oluşturucu" takma ad kullanmıyorsa "çarpışmaların" adının önlenmesi olabilir.

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

SELECT * FROM person JOIN company ON ...

Her iki sorguda, hangi varlıklara ait olduğunu "söylemeden" iki "ad" sütunu ( ad_1, ad_2 ) olur. Ve üretilen sütun adlarından asla emin olamazsınız (ad_2 veya ad_3 veya ... olur). Önceden tablo adı kullanırsanız, sütun adları person_name , company_name olur , böylece hangi öğeye ait olduğunu bilirsiniz, artı sütun adlarının sabit kalacağını da bilirsiniz (örneğin, Java’da JDBC kullanarak ).

Takma ad kullanıyorsanız her iki argüman da göz ardı edilebilir, ancak bence şirketler için uygulanan kodlama sözleşmelerinin çoğu iyi uygulamaları takip etmeyen birçok (küçük) programcının bir sonucu olarak geliyor. Bu durumda, örneğin, bir SELECT ifadesinde joker karakter kullanmak, ad öneki olmadan sorunlara neden olabilir.

Tablo ve sütun adlarındaki alt çizgi için, yoğun olarak kullanıyorum çünkü ayırıcı olarak yalnızca adlarda alt çizgi ve alt çizgi kullanıyorum. Yalnızca küçük harf kullanmak, tanımlayıcıları SQL anahtar kelimelerinden (büyük harflerle yazdığım) ayırt etmenize yardımcı olur:

SELECT person_name, COUNT(bought_product) FROM bought_products WHERE person_name LIKE 'A%'

6
Farklı tablolardaki aynı bilgilere sahip tüm sütunların aynı isme sahip olması ve 1'den fazla masa tablası kullanmanın zorunlu standart olacağını bilmesini isterdim. Hangi masa örtüsü, hasta kimliği, hasta kimliği, kimliği veya kipinin eşleştiğini hatırlamaktan yoruldum.
Pieter B

1
Tüm sütunları takma olmadan bir üretim sorgusu yazmam. Bakımı çok daha kolay hale getirir. Tabii ki, 10-20'ye kadar birleştirme ve 30-50 sütun ve altı ay sonra karmaşık raporlama / ihracat tipi sorgular yazarım, bu sütunun hangi tablodan geldiğini hatırlamak zor.
HLGEM

8

Bu tür önekleri sütun adlarına eklemek, bir tablonun gelişmesini zorlaştıracaktır. Örnek olarak: sonunda tablo adını değiştirmek istediğinizi / değiştirmeniz gerektiğini fark ederseniz, tüm tablo yapınızı değiştirmeniz gerekir (yani, yalnızca tablonun adını değil, aynı zamanda tüm sütunlarının adını da). Bu aynı zamanda, tablonun indekslerini ve onu sorgulayan müşterilerin kodunu güncellemeyi zorlaştıracaktır.


4

Sık sık belirsiz olacak ortak sütun adları (normalde sadece kimlik, bazen isim) için, makul bir şekilde kullanıldığında (Patrick Karcher'ın bağlantınızdaki cevabına göre) istisnalar vardır .

Başka bir en iyi uygulama, her zaman sorgularınızdaki sütun ve nesneleri nitelemek. Böylece sütun önekleri kararsız hale gelir ve kodunuzu bozar.

Bunları karşılaştırın: göze en kolay hangisi?

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

3
Kesinlikle ilki ... :)
ErikE

3
Ne hakkında SELECT name, salary FROM dbo.Person? : P
cHao

1
@cHao: Bu konuda SCHEMABINDING İLE bir görünüm oluşturmayı deneyin ...
gbn

@gbn: Benim için iyi çalışıyor. 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
İlgili belgeler ( msdn.microsoft.com/en-us/library/ms187956(v=SQL.105).aspx ): "SCHEMABINDING kullanıyorsanız, select_statement, tabloların iki bölümlü adlarını (schema.object) içermelidir, görünümler veya başvuruda bulunulan kullanıcı tanımlı işlevler. " O Not sütunlar ... sadece tablolar, görünümler ve işlevler (aksi takdirde çözmek sorguda belirsizliklere gerekmediği sürece) noktalı isimler gerektirmez.
cHao

3

Genel olarak, gerçekten her yerde standartlar gibi görünmüyor. Bağlandığınız sorunun tamamen farklı sözleşmelere sahip yüksek oylu birkaç cevabı var. Tabii ki, herkes kendi standartlarını savunacak ve bir projede tutarlı sözleşmeler yapmak çok daha önemli.

Bununla birlikte, sütun adlarının öneklenmesi fazlaca gözüküyor. Hangi tabloyla çalıştığınızı zaten biliyorsunuz ve aynı ada sahip farklı tablolardan iki sütun içeren bir durum tablo veya sütun takma adları kullanılarak kolayca çözülebilir.


2

TSQL'de, belirsizlikten kaçınmak istiyorsanız, TableName.FieldName formundaki alanlara başvurabilirsiniz; bu nedenle, alan adlarına tablo adları eklemek aslında TableName.TableName_FieldName veya benzerlerini yaparak okunabilirlikten uzaklaşır. Alt çizgi kullanmanın veya kullanmamanın kişisel bir tercih olduğunu düşünüyorum. CamelCase'i tercih ediyorum ve bir sonek veya benzerini eklemek istediğimde _ kullanıyorum, örneğin TableName_Temp, ama bu sadece benim.


2

Bir keresinde sütunların önekini yapmak için kısa kodlar kullanmaya karar verdiğimiz bir sistem üzerinde çalıştım. PK alanları "tam tablo adını" önek olarak kullandı ve diğer tüm sütunlar önekleri olarak sürekli olarak 2-4 karakter kullandı. Her sütun ayrıca soneki olarak bir veri alanı kullandı. Sürekli yapılırsa, çok güzel ve temiz olabilir. Bir tür veya başka bir adlandırma standardının özensiz kodlamaya neden olması saçmadır. Tutarlı bir standardın varlığı önemli olan şeydir. Açık bir standart olmadığı için ve her şeyden daha fazlasının bana veri yapılarında sorun yaşayabileceğini gösteren, tutarsız olan birkaç veritabanı gördüm. Bir veritabanı tasarımcısının objeleri ve alt yapılarını tutarlı bir şekilde adlandıramazsa,


1

Ön ek, kötü bir uygulamadır çünkü önlenmesi için tasarlanan soruna neden olur. Belirttiginiz gibi, ön ekli sütunları okumak çok zor. İki tabloya katılacağınız bir sorguda çoğaltılmış sütun adlarıyla sonlandırırsanız, belirli tablolara sürekli katılabiliyorsanız, bunu sizin için çözen veya bir görünüm, saklı yordam veya sizin için yapan kullanıcı tanımlı bir işlevdir.

Tablo adında altı çizili bir kullanım söz konusu olduğunda, bu dini bir argümandır. Sonunda görünürlüğü arttırır ve işleri kolaylaştırır. Genelde hiçbir zaman sütun veya tablo adında boşluk veya tablo olmazdı. Ancak, yalnızca bir raporlama paketi tarafından kullanılan veya bir CSV dosyasına aktarılan tablolar veya görünümler için bir istisna yapabilirim.


1

Birçok veritabanının, bir sütun adındaki karakter sayısında (yani Oracle) katı sınırları vardır.

Uzun sütun adlarına izin veren bir veritabanıyla çalışıyorsanız, ancak daha sonra bu yapıyı başka bir veritabanı sistemine geçirmek istediğinize karar verirseniz, önekler sütun adlarınızın geçersiz olma olasılığını artıracaktır.

Şimdi SQL Server ile çalışıyor olsanız da, hiç kimse geleceği tahmin edemez ve yazılımınızın gelecekte birden fazla veritabanı üzerinde çalışması gerekebilir.


0

Bir veri sözlüğü (veya "kayıt defteri") yazmayı düşünün. Bununla, modelinizdeki tüm veri öğelerini içeren bir belge kastediyorum: isim, açıklama vb. Modelin uygulanmasından bağımsız olmalı, örneğin tablo isimlerinden bahsetmemelidir. 'ID', 'Type' ve 'Code' gibi isimleri nasıl ayırt edebilirdiniz?

Bir yaklaşım, uluslararası ISO / IEC 11179 standardı kurallarına uymaktır - sonuçta neden tekerleği yeniden icat? Temel yapı:

[Object] [Qualifier] Property RepresentationTerm

öğeler arasındaki sınırlayıcılarla: SQL, sütun adlarındaki boşluklarla iyi oynamaz ve alt çizgi görsel olarak iyi çalışır.

Kuruluşunuzdaki birisinin, bu tür unsur adlarıyla geldiklerinde bu yönergeleri izlemeye çalıştığını hissediyorum Person_Person_First_Name.

Göstermeyi sevdiğim örnek İngiltere Ulus Sağlık Hizmeti (NHS) veri sözlüğüdür .

Bu yüzden adlandırma kurallarının seslerle çalışmak zorunda olduğunu sanmıyorum.

SQL uygulama ör günü, gibi bazı halk Nesne ortadan kaldırılabilmesi, tablo adı bağlam örneğin sağlar Eleme ve Mülkiyet alt elemanlar person_first_namehaline gelir first_nameiçinde PersonAncak, veri elemanı basitçe adını pratik kuralı değiştirmek gerektiğini masaya vs. fiziksel modeldeki yeri nedeniyle iyi bir tane gibi görünüyor. Bu kurala uymanın iyi bir fikir olmadığını düşünenlere, kullandıkları tüm isim varyasyonlarını belgeleme görevi verilmelidir :)

Joe Celko'nun Programlama Stili kitabında , sütun adlarında sınırlayıcı olarak alt çizgi tercih edildiğine dair kanıtlar da dahil olmak üzere ISO 11179'un güzel bir özetini bulacaksınız .


0

Bazıları verilerin hangi tablodan geldiğini bilmek kodda daha kolay bulunur, ancak nesne yönelimli bir sistemden bahsediyorsanız, nereden geldiğini bilmek için adın bağlamını kullanmalısınız, bu durumda tablo adı.

Şahsen, tablo adı ön eki, geliştiricilerin çok yetenekli olmadığının bir göstergesidir ve daha derine indikçe diğer birçok kötü kodlama sözleşmesini bulacağınızı ve uygulamanın çok fazla tablo içerdiğini tahmin etmek zorunda kalsaydım, vb.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.