Kısıtlamalarla veri bütünlüğünü zorunlu kılma
Kısıtlamalar ve sıralı nesneler, veri sorunlarını gerçekleşmeden önce engelleyen tasarım seçimleridir. Eksik yabancı anahtar kısıtlaması, yalnız bırakılmış kayıtların veritabanınızda zaten mevcut olabileceği anlamına gelir. Daha sonra kimlik sütunlarını değiştirmek için sıralı nesneler eklemek için tüm uygulamalarda değişiklik yapılması gerekir. Uygulama kodu verileri doğrulayabilir, ancak kullanıcılar toplu içe aktarmalar, doğrudan sorgular veya doğrulamayı baypas eden yeni uygulamalar aracılığıyla bu doğrulamayı atlayabilir.
Veritabanı kısıtlamaları, kuralları motor düzeyinde uygular, bu nedenle her zaman geçerlidir. Veritabanında hangi kuralların zorunlu kılınması ve kimlik sütunlarının veya dizilerinin kullanılıp kullanılmaması gibi tasarım sırasında verebileceğiniz kararlar, uygulamanızın ömrü boyunca veri kalitenizi etkiler.
Kısıtlamaların ne zaman kullanılacağını anlama
Veri kalitesi sorunları pahalıdır. Düşük veri kalitesi yanlış iş kararlarına, başarısız tümleştirmelere ve uyumluluk ihlallerine yol açar. Aynı veritabanına erişen farklı uygulamalar arasında tutarsız olabilecek uygulama düzeyinde doğrulamanın aksine, kısıtlamalar uygulama kodu, geçici sorgular, doğrudan SQL betikleri veya toplu içeri aktarmalar tarafından atlanamadıkları veritabanı altyapısı düzeyinde kuralları zorunlu tutar. Veritabanı altyapısı değişikliği işlemeden önce her INSERT, UPDATEve DELETE işleminin tanımlı tüm kısıtlamaları karşılaması gerekir.
Veritabanı kısıtlamalarını uygulama
Kısıtlamalar, veritabanınızı bozmadan önce veri kalitesi sorunlarını engeller. Aşağıdaki tabloda, her kısıtlama türünün belirli veri bütünlüğü sorunlarını nasıl giderdiğiniz gösterilmektedir:
| Sorun | Kısıtlama | Example |
|---|---|---|
| Yalnız bırakılmış kayıtlar | DIŞ ANAHTAR | Geçerli müşterisi olmayan siparişleri engeller |
| Yinelenen veriler | UNIQUE | Yinelenen e-posta kayıtlarını durdurur |
| Geçersiz veri | CHECK | Negatif fiyatları veya gelecekteki doğum günlerini reddeder |
| Kritik veriler eksik | Null Değil | Tamamlanmamış kayıtları engeller |
| Referans tutarsızlığı | HARİCİ ANAHTAR | Tablolar arasında veri bütünlüğünü korur |
Müşteri e-posta sütununda benzersiz bir kısıtlama tanımlamamış bir perakende şirketi düşünün. Zaman içinde aynı müşteriler aynı e-posta adresleriyle birden çok kez kaydedildi. Pazarlama promosyon kampanyaları gönderdiğinde, bazı müşteriler aynı e-postanın üç kopyasını aldı ve maliyetleri artırdı ve müşteri güvenini zarara düşürtü. Tablo tanımına UNIQUE (EmailAddress) eklemek, bu yinelemelerin eklenmesini tamamen engellerdi.
Kısıtlamalar, verilerin sisteme nasıl girdiğine bakılmaksızın veri kalitesini güvence altına alan veritabanı altyapısı düzeyinde kuralları zorunlu kılar. Uygulama doğrulama atlanabilir, uygulamaya göre değişir ve bakımı daha zordur. Veritabanı kısıtlamaları her zaman uygulanır, merkezileştirilir ve tek bir doğruluk kaynağı sağlar.
Kısıtlamalar, veri kalitesini ve veritabanı düzeyinde tutarlılığı güvence altına alır.
Birincil anahtar kısıtlamalarını kullanma
Birincil anahtar kısıtlamaları benzersiz verileri garanti eder ve varlık bütünlüğünü zorlar. Birincil anahtar kısıtlaması belirttiğinizde, Veritabanı Altyapısı birincil anahtar sütunları için otomatik olarak benzersiz bir dizin oluşturur. Tablo yalnızca bir birincil anahtar kısıtlaması içerebilir ve birincil anahtar kısıtlaması içinde tanımlanan tüm sütunlar olarak NOT NULLtanımlanmalıdır.
Kısıtlamasını PRIMARY KEY kullanarak birincil anahtar oluşturabilirsiniz. Bir örnek aşağıda verilmiştir:
CREATE TABLE Customer (
CustomerID INT PRIMARY KEY IDENTITY(1,1),
EmailAddress NVARCHAR(100) NOT NULL
);
Yabancı anahtar kısıtlamalarını kullanma
Yabancı anahtar kısıtlamaları, yabancı anahtar tablosunda depolanabilecek verileri denetleyerek bilgi tutarlılığını zorunlu tutar. Yabancı anahtar kısıtlaması, bu değişiklikler yabancı anahtar tablosundaki verilere bağlantıyı geçersiz kılacaksa birincil anahtar tablosundaki verilerde değişiklik yapılmasını engeller.
basamaklı başvuru eylemleri gibi CASCADE, SET NULL veya SET DEFAULT gibi eylemleri tanımlayarak, bir kullanıcı mevcut yabancı anahtarların işaret ettiği bir anahtarı silmeye veya güncellemeye çalıştığında ne olacağını belirtebilirsiniz.
Yabancı anahtar sütunlarında el ile dizin oluşturma gerekli olmasa da, yabancı anahtar sütunları birleştirme ölçütlerinde sıklıkla kullanıldığından bu genellikle yararlıdır.
FOREIGN KEY kısıtlaması ve REFERENCES ifadesi kullanarak bir yabancı anahtar oluşturabilirsiniz. Bir örnek aşağıda verilmiştir:
CREATE TABLE Order (
OrderID INT PRIMARY KEY IDENTITY,
CustomerID INT NOT NULL,
OrderDate DATETIME2,
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
);
Benzersiz kısıtlamaları kullanma
Benzersiz kısıtlamalar , birincil anahtara katılmayan belirli sütunlara yinelenen değer girilmamasını sağlar. Kısıtlamalardan farklı olarak PRIMARY KEY , UNIQUE kısıtlamalar değerine NULLizin verir. Ancak, bir UNIQUE kısıtlamaya katılan tüm değerlerde olduğu gibi sütun başına yalnızca bir null değere izin verilir. Veritabanı Altyapısı, benzersizlik gereksinimini zorunlu kılmak için otomatik olarak benzersiz bir kümelenmemiş dizin oluşturur.
anahtar sözcüğünü UNIQUE kullanarak benzersiz bir kısıtlama oluşturabilirsiniz. Bir örnek aşağıda verilmiştir:
CREATE TABLE Product (
ProductID INT PRIMARY KEY,
SKU NVARCHAR(50) UNIQUE,
ProductName NVARCHAR(100)
);
Denetim kısıtlamalarını kullanma
Denetim kısıtlamaları , bir veya daha fazla sütun tarafından kabul edilen değerleri sınırlayarak etki alanı bütünlüğünü zorlar. Herhangi bir mantıksal ifadeyi kullanarak, mantıksal işleçlere göre TRUE veya FALSE döndüren bir CHECK kısıtlaması oluşturabilirsiniz. Tek bir sütuna birden çok CHECK kısıtlama uygulayabilir veya birden çok sütuna tek CHECK bir kısıtlama uygulayabilirsiniz.
Null değerler UNKNOWN olarak değerlendirildiğinden, ifadelerdeki mevcudiyetleri bir kısıtlamayı geçersiz kılabilir. Örneğin, bir sütundaki MyColumn = 10 kısıtlaması, NULLFALSE olarak değerlendirilmediği için NULL eklenmesine yine de izin verir.
Anahtar sözcüğünü mantıksal ifadeyle kullanarak CHECK bir CHECK kısıtlaması oluşturabilirsiniz. Bir örnek aşağıda verilmiştir:
CREATE TABLE Employee (
EmployeeID INT PRIMARY KEY,
HireDate DATE,
Salary DECIMAL(10,2),
CHECK (Salary >= 20000),
CHECK (HireDate <= GETDATE())
);
Varsayılan kısıtlamaları kullan
Varsayılan kısıtlamalar, işlemler sırasında INSERT hiçbir değer belirtilmediğinde varsayılan değerleri sağlar. Veritabanı projeleriyle çalışırken, ortamlar arasında farklılık gösteren sistem tarafından oluşturulan adlara izin vermek yerine açık adlarla kısıtlamalar oluşturmanız önerilir.
anahtar sözcüğünü kullanarak DEFAULT kısıtlaması DEFAULT oluşturabilirsiniz. Bir örnek aşağıda verilmiştir:
CREATE TABLE Activity (
ActivityID INT PRIMARY KEY IDENTITY,
Description NVARCHAR(200),
CreatedDate DATETIME2 CONSTRAINT DF_Activity_CreatedDate DEFAULT GETUTCDATE(),
IsActive BIT CONSTRAINT DF_Activity_IsActive DEFAULT 1
);
Sıralı nesneleri kullanma
Sıra nesnesi, sıranın oluşturulduğu belirtime göre sayısal değerler dizisi oluşturan kullanıcı tanımlı şemaya bağlı bir nesnedir. Kimlik sütunlarından farklı olarak, diziler belirli tablolarla ilişkili değildir. Uygulamalar bir sonraki değerini almak için bir dizi nesnesine başvurur ve diziler ile tablolar arasındaki ilişki uygulama tarafından denetlenir.
Tek bir tablo için otomatik numaralandırmaya ihtiyacınız olduğunda kimlik sütunları düzgün çalışır. Ancak, bu tek bir tabloyla sınırlıdır. Sayıları birden çok tabloda paylaşamaz, satır eklemeden önce bir sonraki değeri alamaz veya sayacı kolayca sıfırlayamazsınız. Sıralı nesneler, herhangi bir tablodan bağımsız olarak sayılar oluşturarak bu sorunları çözer.
Dizilerin ne zaman kullanılacağını anlamak
Aşağıdaki senaryolarda kimlik sütunları yerine dizileri kullanın:
- Paylaşılan numara serisi - Uygulama, birden çok tablo veya tablo içindeki birden çok sütun arasında tek bir sayı serisinin paylaşılması gerekir.
- Döngü numarası serisi - Belirtilen bir sayıya ulaşıldığında uygulamanın numara serisini yeniden başlatması gerekir. Örneğin, 1 ile 10 arasında değerler atandıktan sonra uygulama 1 ile 10 arasında değerleri yeniden atamaya başlar.
-
Sıralanmış sıra değerleri - Uygulama, sıra değerlerinin başka bir alana göre sıralanması gerekir.
NEXT VALUE FORişlevi, döndürülen değerlerinOVERyan tümcesi sırasına göre oluşturulmasını garanti edenORDER BYyan tümcesini uygulayabilir. -
Birden çok sayı ayır - Bir uygulamanın aynı anda birkaç sıralı sayı ayırması gerekir. Kimlik değerlerini istemek, diğer işlemlerin aynı anda sayı verilmesi durumunda boşluklara neden olabilir.
sp_sequence_get_rangeifadesi, dizideki birkaç numarayı bir seferde alır. - Değiştirilebilir belirtim - Oluşturma işleminden sonra sıranın belirtimini (artım değeri gibi) değiştirmeniz gerekir.
Sıralı nesneler kimlik sütunlarından daha fazla esneklik sunabilir:
| Özellik | Sıra | Kimlik |
|---|---|---|
| Tabloya bağlı | Hayı | Evet |
| Tablolar ve sütunlar arasında ortak kullanılan | Evet | Hayı |
| Ekleme işleminden önce sonraki değeri alma | Evet | Hayı |
| Özel min/max değerleri | Evet | Sınırlı |
| Aynı anda birden çok sayı alma | Evet | Hayı |
| Belirtilen sayıda döngü/yeniden başlatma | Evet | Hayı |
| Değerleri başka bir alana göre sıralama | Evet | Hayı |
| Oluşturulduktan sonra artırımı değiştirme | Evet | Hayı |
Tek bir tablo için basit bir otomatik ölçeklendirme birincil anahtarına ihtiyacınız olduğunda ve aynı sayı serisini birden çok tabloda paylaşmanız veya satırı eklemeden önce bir sonraki değeri almanız gerekmediğinde bir kimlik sütunu kullanın.
Uygulamanız ekleme yapılmadan önce bir sayı gerektirdiğinde, birden çok tablo arasında tek bir seri paylaşması gerektiğinde, belirtilen sayıya ulaşıldığında numara serisini yeniden başlatması gerektiğinde veya aynı anda birden çok sıralı numara ayırması gerektiğinde bir dizi kullanın.
Sıra sınırlamalarını anlama
Kimlik sütunlarından farklı olarak, tabloya eklemeden sonra sıra değerleri otomatik olarak korunmaz . Ayrıca, benzersizlik dizilim değerleri için otomatik olarak sağlanmaz. Tablodaki sıra değerlerinin benzersiz olması gerekiyorsa, sütunda benzersiz bir kısıtlama oluşturun.
Sıra numaraları geçerli işlemin kapsamı dışında oluşturulur. Sıra numarasını içeren işlemler onaylansın veya geri alınsın fark etmeksizin kullanılırlar.
CREATE SEQUENCE deyimini start, increment ve range için isteğe bağlı parametrelerle kullanarak bir dizi nesnesi oluşturabilirsiniz. Bir örnek aşağıda verilmiştir:
-- Create sequence
CREATE SEQUENCE OrderNumber
START WITH 1000
INCREMENT BY 1
MINVALUE 1000
MAXVALUE 999999
NO CYCLE;
-- Use sequence in INSERT with NEXT VALUE FOR function
INSERT INTO Order (OrderID, CustomerID, OrderNumber, OrderDate)
VALUES (1, 100, NEXT VALUE FOR OrderNumber, GETDATE());
-- Get next value before INSERT
DECLARE @NextOrderNum INT = NEXT VALUE FOR OrderNumber;
SELECT @NextOrderNum;
-- Get multiple sequence numbers at once for batch processing
DECLARE @FirstSeq INT, @LastSeq INT;
EXEC sp_sequence_get_range
@sequence_name = N'OrderNumber',
@range_size = 100,
@range_first_value = @FirstSeq OUTPUT,
@range_last_value = @LastSeq OUTPUT;
-- Reset sequence
ALTER SEQUENCE OrderNumber RESTART WITH 1000;
Bu örnek, 1000'den başlayan, 1'e kadar artan ve geri dönmeden 999999'de duran adlı OrderNumber bir dizi oluşturur.
NEXT VALUE FOR işlevi, bir INSERT deyimi sırasında satır içi olarak ya da uygulamanın değere önce başvurması gerektiğinde, eklemeden önce bir değişkene atanan bir sonraki kullanılabilir numarayı alır. Aynı anda birden çok sıralı sayı gerektiren toplu işlemler için, sp_sequence_get_range aralıktaki ilk ve son değerleri döndüren 100 sayılık bir blok ayırır. deyimi ALTER SEQUENCE gerektiğinde diziyi yeniden 1000'e sıfırlar.
Kısıtlamalar, sorunları oluşmadan önce engelleyen mimari kararlardır. Eksik CHECK bir kısıtlama geçersiz verilerin veritabanınızı sessizce bozulmasına olanak tanır. Tablolar arası numaralandırmaya ihtiyacınız olduğunda kimlik sütunlarını seçmek, uygulama bazında çözüm arayışlarını gerektirir. Veritabanı düzeyinde tanımlanan kısıtlamalar veritabanınıza erişen uygulama, araç veya betiklerden bağımsız olarak veri kalitesini korur. Bu kararlar, uygulamanızın ömrü boyunca veri bütünlüğü garantilerinizi şekillendirmektedir.