MS SQL Server İsimlendirme Kılavuzu
SQL Server veritabanı tasarımı ve programlama süreçlerinde kullanılmak üzere belirli, tutarlı bir isimlendirme ve biçimlendirme kılavuzu hedeflenmektedir.
1. Giriş
1.1 Amaç
Bu belgenin amacı SQL Server veritabanı tasarımı ve programlama süreçlerinde kullanılmak üzere belirli, tutarlı bir isimlendirme ve biçimlendirme kılavuzu sunarak, anlamlı, kolay anlaşılabilir bir veritabanı yapısı oluşturmaya ve programlama mantığı üretilmesine, veritabanı genelinde anlamsal ve biçimsel bir bütünlüğün sağlanmasına yardımcı olmaktır.
1.2 Kaynaklar
Bu belge oluşturulurken Database object naming conventions[1] içeriğinden faydalanılmıştır.
1.3 Referanslar
[1] Database object naming conventions, http://vyaskn.tripod.com/object_naming.htm
2. İsimlendirme
2.1 Baş harf yazım biçimleri
Kullanılması uygun iki farklı baş harf yazım biçimi vardır:
PascalCasing
İsmin ilk harfi ve birleştirilen her kelimenin ilk harfi büyüktür. İki harften uzun kısaltmalar dahil tüm nesne isimleri için kullanılabilir.
OrderId
BinNumber
İki harften oluşan kısaltmaların özel biri durumu vardır. İki harf de büyük yazılır.
IOStream
camelCasing
İsmin ilk harfi küçük, birleştirilen her kelimenin ilk harfi büyüktür. İki harften oluşan kısaltmalarda iki harf de küçüktür.
orderId
ioStream
binNumber
Aksi belirtilmedikçe veritabanı nesnelerini isimlendirmek için PascalCasing kullanın.
Hungarian notasyonu kullanmayın.
Hungarian (Macar) Notasyonu Macar notasyonu belirteç isimlerinin veri tiplerini içerecek şekilde tanımlandığı bir isimlendirme şemasıdır. Belgelendirme ve isimlendirmenin bir arada kullanıldığı bir isimlendirme tekniğidir.
Örnek:
strCustomerName
iInstallmentCount
2.2 Genel isimlendirme kuralları
Kelime Seçimi
Kolay okunabilir isimler seçin.
Örneğin,
HorizontalAlignmentadlı bir özellik,AlignmentHorizontalisminden daha kolay okunabilir bir yapıdadır. (İngilizce için)Kısa olmaya değil, açık olmaya gayret edin.
Macar notasyonu kullanmayın.
Rezerve edilmiş veya anahtar kelimelerden kaçının.
Kısaltmalar
İsimlerin sadece bir parçasından oluşan, kelime sadeleştirme amaçlı kısaltmalar kullanmayın.
Örneğin
GetOrdsyerineGetOrdersolarak isimlendirin.
Yaygın olarak kabul edilmemiş kısaltmalar (kelimelerin baş harflerinden oluşan) kullanmayın ya da yaygınlarsa bile sadece gerektiğinde kullanın.
Diğer Kurallar
Önekler büyük harfle yazılır ve varlığın isminden alt_çizgi ile ayrılır. Varlık isimleri birden fazla kelimeden oluşsa da kelimeler alt_çizgi kullanılarak ayrılmaz.
ORD_OrderInvoiceAddressNesneleri isimlendirirken boşluk karakteri kullanılmaz. Kullanılmak zorunda kalınırsa isim köşeli parantez içine alınmalıdır.
[Order Line]2.3 Nesnelerin isimlendirilmesi
2.3.1 Tablo
Tabloları isimlendirirken tabloda tutulacak varlığı temsil eden ismi kullanın. Örneğin, ürünlerin saklanacağı tablo için
Productismi uygundur.İsimlendirilecek tabloda tutulacak veri birden fazla varlığı veya bu varlıkların ilişkisini temsil ediyorsa, birden fazla adı birleştirerek isimlendirin. Örneğin, siparişin içerdiği ürünlerin saklanacağı tablo için
OrderProductgibi.Tabloları isimlendirirken tekil isimler kullanın. Örneğin,
ProductsdeğilProduct.Tablo isimlerinde, bunun bir tablo olduğunu belirtmek için “
tbl”, “tbl_”, “T_” benzeri önekler kullanmayın.İsimlendirilecek tablolar belli bir mantıksal grup oluşturuyorsa ya da belli bir uygulamanın kullanımı için özel olarak oluşturuluyorsa iki veya üç büyük harften oluşan ve alt_çizgi ile devam eden bir grup öneki kullanabilirsiniz. Örneğin, sadece ERP entegrasyonunu ilgilendiren tablolar için aşağıdaki isimler uygundur.
ERP_OrderERP_Product
Tüm veritabanı tek bir mantıksal grubu temsil ediyorsa bu önekleri kullanmayın.
2.3.2 View
View nesnelerini isimlendirmek için tablo isimlendirme kuralları kullanılır.
2.3.3 Stored Procedure
Stored procedure nesneleri belli bir işi yapmak amacıyla tasarlandığından isimlendirmede işlemi temsil eden bir fiil ve işlemin uygulanacağı varlığı temsil eden bir ad veya birden fazla adın birleşimini kullanın.
Örneğin,
GetOrderLinesveyaAddOrderTablolarda olduğu gibi, ilişkili prosedürleri bir önek ile gruplayın. Örneğin, sipariş işlemleri ile ilgili prosedürleri
ORD_önekini kullanarak isimlendirmek uygundur.ORD_AddOrderORD_AddOrderLinesORD_UpdateOrder
Temel CRUD (Create, Read, Update, Delete) işlemleri için isimlendirmeler
Add Yeni kayıt eklemek için. Örnek:
AddMemberGet Sorgulama yaparak kayıt veya kayıt listesi almak için. Örnek:
GetOrderLinesUpdate Mevcut kaydı güncellemek için. Örnek:
UpdateDeliveryAddressDelete Kayıt silmek için. Örnek:
DeleteShoppingCartItemKaçınılması gereken prosedür isimlendirmeleri
Prosedürleri asla “
sp_” öneki ile isimlendirmeyin. Eğer “sp_” öneki ile başlayan bir isme sahip bir prosedürü çağırırsanız, SQL Server bu prosedürü önce master veritabanında arar. Ancak orada bulamadığında, kullanıcı veritabanında arar.Stored procedure isimlerinde, bunun bir stored procedure olduğunu belirtmek için “
usp_”, “sproc_” benzeri önekler kullanmayın.Aşağıdaki önekler ve benzerlerini içeren isimler prosedürlerde iş mantığı işletildiğini belirtilir. Bu nedenle bu şekilde çalışan ve isimlendirilen prosedürler oluşturulmamalıdır. Kontrollerin veya iş mantığının işletileceği veriler döndürülmeli, işlemler uygulama kodunda yapılmalıdır.
Does Örnek:
DoesMemberExistWithUsernameIs Örnek:
IsMemberBlockedHas Örnek:
HasMemberUnreadMessageValidate Örnek:
ValidateOrderCheck Örnek:
CheckPasswordResetRequest2.3.4 Kullanıcı tanımlı fonksiyonlar
Kullanıcı tanımlı fonksiyonları (user defined functions, UDFs) isimlendirmek için stored procedure isimlendirme kuralları kullanılır.
2.3.5 Trigger
Trigger nesneleri özel bir tür stored procedure olsalar da isimlendirmelerinin aynı şekilde yapılması mantıklı değildir.
Trigger nesneleri her zaman bir tabloya bağlı çalıştıklarından trigger nesnesi isimlendirilirken, bağlı olduğu tablonun adı kullanılır.
Trigger nesneleri bir veya daha fazla işlem (Insert, Update, Delete) ile ilişkili olduklarından, isimlendirmede yapılan işlemin adı da kullanılır.
Örnek isimlendirmeler aşağıdaki gibidir:
Product_InsTrgProduct_UpdTrgProduct_DelTrg
Aynı işlem için birden fazla trigger tanımlanırsa, isimlendirmede yapılan işin açıklaması eklenerek trigger nesneleri ayrıştırılır. Örneğin,
Product_ValidateData_InsTrgProduct_MakeAuditEntries_InsTrg
Aynı trigger birden fazla işlem için kullanılıyorsa, “Ins”, “Upd”, “Del” ifadeleri belirtilen sırayla birleştirilerek isimlendirmede kullanılır. Örneğin,
Product_InsUpdTrg
2.3.6 İndeks
İndeksler de trigger nesneleri gibi kendi başlarına var olamayan, bir tabloya bağımlı nesneler olduklarından, isimlerinde tablo ve kolon adlarını kullanmak mantıklıdır.
Ayrıca indeksler clustered ve non-clustered indeksler olarak ikiye ayrılır. Bu iki tip indeks de unique veya non-unique olabilir. Bu nedenle isimlendirme kalıbı tüm bu durumları içerirse anlamlı bir isim oluşturulmuş olur.
Tablo adı + kolon adı (adları) + Unique/Non-unique olma durumu + Clustered/Non-clustured olma durumu + idxÖrneğin, Title tablosunun TitleId kolonu için tanımlanan unique, clustered indeks adı:
Title_TitleId_U_CidxPublisher tablosunun PubId kolonu için tanımlanan unique, non-clustered indeks adı:
Publisher_PubId_U_NidxOrderDetail tablosunun OrderId kolonu için tanımlanan non-unique, non-clustered indeks adı:
OrderDetail_OrderId_NU_Nidxİndeksler birden fazla kolondan oluşan bileşik bir yapıya sahip olabilir. Bu durumda indeksin uygulandığı kolon adları birleştirilir. OrderLine tablosunun OrderId ve OrderLineId kolonları için tanımlanan unique, clustered indeks adı:
OrderLine_OrderIdOrderLineId_U_Cidxİndeksler belirtilen biçimlerde isimlendirilmezse SQL Server'da tasarım modunda eklenirken otomatik verilen isimler kullanılır.
2.3.7 Kolon
Primary key olan Id kolonları hariç, tüm kolonlar temsil ettikleri varlık özelliğiyle isimlendirilir.
Örneğin, Member tablosunda yer alan üye adı kolonu aşağıdaki gibidir:
NamePrimary key olan Id kolonları, tablo adını önek olarak kullanarak isimlendirilir.
Örneğin, Member tablosunda yer alan Id kolonu aşağıdaki gibidir:
MemberId2.3.8 Kullanıcı tanımlı veri tipleri
Kullanıcı tanımlı tipler, veritabanının sağladığı temel tiplerden türetilen sarıcı veri tipleridir. Kullanıcı tanımlı veri tiplerinin isimlendirilmesinde temsil edilecek özelliğin adı ve temel veri tipi birleştirilerek kullanılır.
Örneğin, MemberId adlı bir veri tipinin ismi:
MemberId_type2.3.9 Primary Key
Primary key, bir tablodaki her kaydı benzersiz olarak belirleyen kolon veya kolonlardır. Primary key isimlendirirken aşağıdaki kalıp kullanılır:
PK_tablo adı_kolon adıÖrneğin, Member tablosundaki MemberId kolonu primary key olarak atanırken aşağıdaki gibi isimlendirilir:
PK_Member_MemberIdBirden fazla kolondan oluşan primary key isimlerinde kolon adları tabloda tanımlandığı sırayla birleştirilerek kullanılır. Bu şekilde oluşturulan isimler uzun olabilir, ancak primary key doğrudan çağrılan bir nesne olmadığından bu bir sorun teşkil etmez.
Primary key nesneleri belirtilen biçimlerde isimlendirilmezse SQL Server'da tasarım modunda eklenirken otomatik verilen isimler kullanılır.
2.3.10 Foreign Key
Foreign key, ilişkili tabloların aralarındaki ilişkiyi temsil etmekte kullanılır. Referans gösteren tablonun kolon adı ile referans gösterilen tablonun primary key kolonu arasındaki bir bağlantı olarak düşünülebilir.
Foreign key isimlendirmede aşağıdaki kalıp kullanılır:
FK_referans gösteren tablo + referans gösteren kolon_referans gösterilen tablo + referans gösterilen kolonÖrneğin, Order tablosundaki MemberId kolonundan Member tablosundaki MemberId kolonunu referans gösteren foreign key ismi aşağıdaki gibidir:
FK_OrderMemberId_MemberMemberIdForeign key bileşik olabilir. Bu durumda referans gösteren ve gösterilen tabloların kolon adları birleştirilerek kullanılır. Bu şekilde oluşturulan isimler uzun olabilir, ancak foreign key doğrudan çağrılan bir nesne olmadığından bu bir sorun teşkil etmez.
Foreign key nesneleri belirtilen biçimlerde isimlendirilmezse SQL Server'da tasarım modunda eklenirken otomatik verilen isimler kullanılır.
2.3.11 Default ve Check Kısıtları
Default veya check kısıtlarının isimlendirilmesi, kısıtın uygulandığı kolon adının başına “DEF_” veya “CHK_” önekleri eklenerek yapılır.
Örneğin, OrderDate kolonu için default kısıt DEF_OrderDate olarak, check kısıtı CHK_OrderDate olarak isimlendirilir.
Default ve check kısıtları belirtilen biçimlerde isimlendirilmezse SQL Server'da tasarım modunda eklenirken otomatik verilen isimler kullanılır.
2.3.12 Değişkenler
Değişkenler için kolon isimlendirme kuralları uygulanır.
3. Biçimlendirme
3.1 Genel
Anahtar kelimeleri büyük harfle yazın. (
SELECT, WHERE, INT, NVARCHAR, vb.)Büyük-küçük harfle yazım biçimlerini tutarlı olarak kullanın. Büyük-küçük harf yazımına duyarlı olmayan sunucularda sorun çıkmayabilir, ancak büyük-küçük harf yazımına duyarlı olan bir SQL Server veritabanında sorunlar yaşanabilir.
Örneğin büyük-küçük harf yazımına duyarlı bir veritabanında bir tablo oluşturduğunuzda, tabloya yapılan referanslar
CREATE TABLEifadesinde belirttiğiniz ifade ile aynı biçimde olmalıdır.CREATE TABLEifadesinde tablonun adıOrderolarak belirtilirse, birSELECTifadesindeorderbiçiminde kullanıldığında “Nesne bulunamadı.” hatası alırsınız.IF, CASE, BEGINbenzeri kod bloklarında blok içeriklerini bir sekme (tab) karakteri kadar içeriden başlatın.
Örnek:
IF (TRUE)
BEGIN
SELECT 1;
END
ELSE
BEGIN
SELECT 0;
END3.2 Sorgular
Stored procedure, trigger ve function gibi nesnelerde yazılan sorgu ifadeleri ve genel ifadelerin beklenen yazım biçimi aşağıdaki örnekte verilmiştir.
SELECT
ORD.OrderId,
MEM.MemberName
FROM
Order AS ORD
INNER JOIN Member AS MEM ON ORD.MemberId = MEM.MemberId
WHERE
MEM.MemberName LIKE 'Ali%'
AND OrderId > 500
ORDER BY
MEM.MemberNameSELECT, FROM, WHEREbenzeri anahtar kelimeleri satır başlarına yazın, kendilerinden sonra gelen ifadeleri bir alt satırda, satır başından bir sekme (tab) karakteri kadar içeride yazın.SELECTifadelerinde kolon listesindeki her bir kolonu ayrı bir satırda yazın ve bağlı olduğu tablo adını belirtin.WHEREfiltrelerindeAND, ORbenzeri her operatör için yeni bir satıra geçin.ORDER BYifadelerinde kolon numarası yerine kolon adı kullanın. Aşağıdaki örneklerden ikincisi birinci örnekten daha kolay okunabilir bir biçime sahiptir.
Örnek 1:
SELECT
OrderId,
OrderDate
FROM
Order
ORDER BY
2Örnek 2:
SELECT
OrderId,
OrderDate
FROM
Order
ORDER BY
OrderDateEski tarz join ifadeleri yerine daha kolay okunan ANSI-Standardı join ifadeleri kullanın. ANSI join ifadelerinde, WHERE bölümü sadece veri filtrelemek için kullanılır. Eski tarz join ifadelerinde, WHERE bölümü hem join koşulunu hem de veri filtreleme işlemini gerçekleştirir. Aşağıdaki ilk örnek eski tarz join sözdizimini kullanır. İkinci örnek yeni ANSI join sözdizimi ile ifade edilmiştir.
Örnek 1:
SELECT
AUT.AuthorId,
TTL.Title
FROM
Title TTL,
Author AUT,
TitleAuthor TAU
WHERE
AUT.au AuthorId id = TAU. AuthorId
AND TAU.TitleId = TTL.TitleId
AND TTL.Title LIKE '%Computer%'Örnek 2:
SELECT
AUT.AuthorId,
TTL.title
FROM
Authors AUT
INNER JOIN TitleAuthor TAU ON AUT. AuthorId = TAU. AuthorId
INNER JOIN Title TTL ON TAU.TitleId = TTL.TitleId
WHERE
TTL.Title LIKE '%Computer%'3.3 Saklı Yordam (Stored Procedure) Şablonu
Aşağıdaki örnekte bir stored procedure yapısı gösterilmiştir. Oluşturulan ve güncellenen stored procedurelerin burada belirtilen formatta olmasını sağlamak, tutarlılık sağlamak açısından önemlidir.
-- ======================================================
-- Author : John Doe
-- Create date : 2016-09-27
-- Description : Üye paylaşım bilgisini döndürür.
-- Modification : 2016-11-07 - John Doe - Silindi durumu kontrolü eklendi.
-- Modification : 2016-11-29 - John Doe - Üye adı ve soyadı döndürüldü.
-- Modification : 2017-12-21 - John Doe - Kolon adları düzenlendi.
-- Modification : 2018-03-19 - John Doe - Share -> Post isimlendirmesiyle güncellendi.
-- ========================================================
ALTER PROCEDURE [dbo].[GetPost]
@PostSecureId NVARCHAR(32)
AS
BEGIN
SELECT
P.MemberId,
MEM.FirstName AS MemberFirstName,
MEM.LastName AS MemberLastName,
P.PostId,
P.PostSecureId,
P.PostTypeId,
P.DateCreated,
TP.PostContent,
LP.Url,
LP.Title,
LP.[Description],
LP.[ImageUrl],
LP.[UserDescription]
FROM
Post AS P
INNER JOIN Member AS MEM ON P.MemberId = MEM.MemberId
LEFT OUTER JOIN TextPost AS TP ON P.PostId = TP.PostId
LEFT OUTER JOIN LinkPost AS LP ON P.PostId = LP.PostId
WHERE
P.PostSecureId = @PostSecureId
AND P.IsDeleted = 0
END4. Performans
Sorgularda '
SELECT *' ifadesi kullanmayın. Her zamanSELECTifadesinden sonra gerekli kolon adlarını belirtin.
SELECT Memberd, MemberFirstName, City ...Bu teknik disk I/O işlemini azaltır ve daha iyi performans sağlar.
LIKEanahtar kelimesini kullanarak arama yaparken, karakterlerin başında asterisk (%) kullanımından kaçının. Bu işlem tam tablo taramasına (full table scan) neden olur ve indeks kullanımının amacını ortadan kaldırır.
İlk örnek indeks taraması (index scan) ile sonuçlanırken ikinci örnek indeks araması (index seek) ile sonuçlanır.
Örnek 1:
SELECT
LocationId
FROM
Locations
WHERE
Specialties LIKE '%pples'Örnek 2:
SELECT
LocationId
FROM
Locations
WHERE
Specialties LIKE 'A%s'Eşit değildir operatörlerini (
<>veNOT) kullanmaktan kaçının, çünkü tablo ve indeks taramasına neden olurlar.Mümkün olduğunca türemiş tablo kullanın, çünkü daha iyi performans sağlar. Aşağıdaki örnekte
Employeetablosundan en yüksek ikinci maaş sorgulanır.
SELECT
MIN(Salary)
FROM
Employees
WHERE
EmpID IN
(SELECT TOP 2 EmpID
FROM Employees
ORDER BY Salary Desc)Aynı sorgu aşağıdaki gibi türemiş tablo kullanılarak yazılırsa yaklaşık iki kat hızlı sonuçlanır.
SELECT
MIN(Salary)
FROM
(SELECT TOP 2 Salary
FROM Employees
ORDER BY Salary Desc) AS ABu sadece bir örnektir ve sonuçlar veritabanı tasarımı, indeksler, veri büyüklüğü gibi konulara bağlı farklı senaryolarda daha farklı olabilir. Daha verimli sorgular yazmak için farklı seçenekleri değerlendirin.
Canlı çalışma ortamında SQL toplu ifadelerinin (batch), stored procedure'lerin and trigger'ların başında
SET NOCOUNT ONifadesini kullanın. Bu ifadeINSERT, UPDATE, DELETEveSELECTifadeleri çalıştıktan sonra oluşan '_(1 row(s) affected)_' benzeri mesajları engelleyerek ağ trafiğini azaltır ve prosedür performansını arttırır.
5. Genel Geliştirme Pratikleri
INSERTifadelerinde her zaman kolon listesini belirtin. Bu işlem, tablo yapısı değiştiğinde (bir kolon eklemek, silmek gibi) oluşacak sorunları önler.
Last updated
Was this helpful?