TSQL için kodlama standartları önerilebilir mi?


9

Uzun süredir .Net kodumuz için kodlama standartlarına sahibiz ve bunları nasıl uygulayacağımız konusunda zaman içinde gelişen fikirler için birkaç saygın kaynak var gibi görünüyor.

Ürünlerimiz tarafından kullanılmak üzere yazılmış SQL için bazı standartları bir araya getirebilmek istiyorum, ancak iyi yazılmış SQL'i neyin belirlediğine dair fikir birliği üzerinde orada herhangi bir kaynak yok gibi görünüyor?


1
Pinal Dave'in sitesinde kodlama standartlarının bir listesi var . Bir dizi standart için adil bir temel gibi görünüyorlar.
Will A


1
@ Sadece tanımlamayı kapsayan İskoç; adlandırma, imleçlerin kullanımı / saklı yordamlar / veri tipi seçenekleri veya kodun kalitesini gerçekten etkileyen herhangi bir şey ...
Rowland Shaw

1
tam olarak, bu yüzden neden "yinelenen" değil, "ilgili" olduğunu söyledim.
Scott Whitlock

Yanıtlar:


6

Deneyimlerime göre, aradığım temel şeyler:

  • Tablo ve sütun adlandırma - Kimlik türü sütunları için kimlik, Referans veya Sayı kullanıp kullanmadığınızı, adlar için tekil veya çoğul ifadeleri kullanın (çoğullar tablo adları için ortaktır - örneğin THINGS, sütun adları için tekil - örneğin THING_ID). Benim için buradaki en önemli şeyler, insanların zaman kaybetmesini önleyen tutarlılıktır (örneğin, birinin THING'i bir tablo adı olarak koyduğu yazım hatalarına girmezsiniz, çünkü sadece sezgisel olarak tablo adlarının asla tekil olmadığını bilirsiniz).

  • Tüm oluşturmalar, dosyalarının bir parçası olarak bir damla (var olan nesneye bağlı) içermelidir. Ayrıca size hibe izinleri eklemek de isteyebilirsiniz.

  • Seçimler, güncellemeler, eklemeler ve silme işlemleri, bir satır adı, bir tablo adı ve satır başına cümle ile yan tümce / sıraya göre düzenlenmelidir, böylece hata ayıklama sırasında birer birer kolayca yorumlanabilir.

  • Özellikle karıştırılabilecekleri nesne türleri için önek (böylece v en önemli görünümdür). Hala uygulanıp uygulanmadığından emin değilim ancak sp_'yi başlatmak için sistem prosedürleri dışındaki saklı yordamlar için verimsizdi. Muhtemelen onları farklılaştırmak için en iyi uygulama usp_ en son kullandığım şeydi.

  • Bir tetikleyicinin adının güncelleme / ekleme / silme ve uygulanacağı tablo için nasıl olması gerektiğini belirten bir standart. Tercih ettiğim bir standart yok, ancak bu kritik bir bilgidir ve bulunması kolay olmalıdır.

  • SQL Server'ın önceki sürümlerinde veya 2005 ve sonraki sürümlerde bulunması gereken şemada nesnelerin sahipliği için standart. Bu sizin çağrınızdır, ancak hiçbir zaman kimin bir şeye sahip olduğunu / nerede yaşadığını tahmin etmemelisiniz) ve mümkünse şemanın / sahibinin yanlış oluşturulma olasılığını en aza indirmek için CREATE komut dosyalarına dahil edilmesi gerekir.

  • SELECT * kullanan herkesin kendi idrarından bir bardak içeceği belirtisi.

  • Gerçekten, gerçekten iyi bir neden (sizin tarafınızdan tembellik içermeyen) olmadığı sürece, başlangıçtan itibaren birincil anahtar / yabancı anahtar ilişkilerine sahip olun, uygulayın ve sürdürün. Sonuçta ilişkisel bir veritabanı düz bir dosya değildir ve yetim kayıtları bir noktada destek hayatınızı cehenneme çevirecektir. Ayrıca, şimdi yapmazsanız, olaydan sonra asla uygulamaya koymayacağınıza dair söz veremeyeceğimize dikkat edin, çünkü verilere sahip olduğunuzda işin 10 katı (asla zorlanmayacağınız için biraz vidalanacak) ilişkiler düzgün).

Eminim bir şeyleri kaçırdım ama benim için onlar gerçekten iyi durumlarda gerçekten fayda sağlayanlardır.

Ancak tüm standartlarda olduğu gibi, daha azı daha fazladır. Kodlama standartlarınız ne kadar uzun olursa, insanların bunları okuma ve kullanma olasılığı o kadar düşük olur. Birkaç iyi aralıklı sayfayı geçtikten sonra, gerçek dünyada gerçekten pratik bir fark yaratmayan şeyleri bırakmaya çalışın, çünkü insanların herhangi birini yapma şansını azaltmış olursunuz.

DÜZENLEME: iki düzeltme - sahiplik bölümündeki şemalar dahil, sayım (*) ile ilgili hatalı bir ipucunun kaldırılması - aşağıdaki yorumlara bakın.


1
Bazı tuhaf seçimler ... "SELECT COUNT (*)" kötü mü? Şemaları hiç duydunuz mu (bu sahiple aynı değildir) Diğerleriniz de iyi
gbn

1
@Jon Hopkins - SELECT * kullanmanın neden kötü olduğunu biliyorum. SELECT COUNT (*) kullanmanın neden kötü olduğunu söyleyebilirseniz harika olur.
k25

1
@gbn @ k25 - Birkaç yıl önce (2002?) Sayımda çok sıcak olan bir DBA'm vardı (*) ama sorularınıza yanıt olarak Google'da bu artık güncel değil gibi görünüyor (şimdiye kadar doğruysa). sqlservercentral.com/articles/Performance+Tuning/adviceoncount/… (Kayıt gerekli). Öncelikle bir Oracle DBA idi, bu yüzden SQL optimizer için de bir sorun olduğunu varsaydığı gerçek bir sorun olabilir.
Jon Hopkins

1
@gbn - Evet, tanıtıldığımdan beri nispeten elimde olmasına rağmen, otomatik reaksiyonum kullanıcılardı. Cevabı şemaları kapsayacak şekilde güncelleyeceğim.
Jon Hopkins

1
@gbn, @ k25 - Sayımda daha fazla kazma (*). Görünüşe göre bu, Oracle 7 ve önceki sürümlerde, 8i ve sonrasında düzeltilen bir sorundu. SQL Server'da bir sorun olsaydı net değil ama kesinlikle artık değil. DBA'mın eski olduğu anlaşılıyor.
Jon Hopkins

3

iyi yazılmış SQL'i neyin belirlediğine dair fikir birliği üzerinde herhangi bir kaynak yok gibi görünüyor

Çünkü fikir birliği yoktur. Örnek olarak, Jon Hopkins'in listesindeki öğelerin en az yarısı için farklı cevaplarım olacaktı ve listesindeki ayrıntı miktarına dayanarak, ikimiz de yaşamak için veritabanlarıyla çalıştığımız güvenli bir tahmin.

Bununla birlikte, bir kodlama standardı hala sahip olmak için iyi bir şeydir ve takımdaki herkesin anladığı ve kabul ettiği bir standart daha iyi bir şeydir, çünkü bu standardın izlenmesi daha olasıdır.


1
+1. Bence en önemli şey takımınız arasında tutarlılığa sahip olmanız.
Dean Harding

1
ilgisiz ne farklı yapardın? Büyük ölçüde tat meseleleri mi (düzen ve benzeri) ya da "zor" hatalar var mı?
Jon Hopkins

1
@Jon: hiçbir sabit hata, tekil tablo adları, tetikleyicilerin nefret, vb gibi sadece öznel şeyler .. BTW, "SELECT *" bir "EXISTS ()" içinde gayet iyi.
Larry Coleman

1
adil örnek (ve ben EXISTS ile kullanıyorum ve kendimi idrar içmeye zorlamıyorum).
Jon Hopkins

1

Jon Hopkins'in cevabına ek olarak ...

  • Dahili ve harici nesneleri ayırma

    • Kısıtlamalar ve indeksler için IX, UQ, TRG, CK vb.
    • küçük harf veya istemci karşı karşıya için CapsCase örn. uspThing_Add
  • Dahili nesneler için "varsayılan olmayan" ise bunları açık yapın

    • UQ = benzersiz kısıtlama
    • UQC = benzersiz kümelenmiş kısıtlama
    • PK = birincil anahtar
    • PKN = kümelenmemiş birincil anahtar
    • IX = dizin
    • IXU = benzersiz dizin
    • IXC = kümelenmiş dizin
    • IXCU veya IXUC = benzersiz kümelenmiş dizin
  • Adlandırma ve izinleri basitleştirmek için şemalar kullanın. Örnekler:

    • Dahili işlemler için Helper.xxx
    • Udfs için HelperFn.xxx
    • Bazı karşılıklı kodlar için WebGUI.xxx
    • Tablolar için Veri ve / veya Geçmiş ve / veya Hazırlama
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.