Veritabanı kısıtlamaları nelerdir? [kapalı]


93

Veritabanı kısıtlamasının net bir tanımı nedir? Bir veritabanı için kısıtlamalar neden önemlidir? Kısıtlama türleri nelerdir?


12
Bu sorunun net bir cevabı var. "Çok geniş" değil. Çok sayıda olumlu oyu ve favorisi, birçok insan için ne kadar yararlı olduğunu ortaya koyuyor. İfadeleri temizledim ve yeniden açılması için aday gösterdim.
La-comadreja

@BasilBourque bu soru Programcılar için çok uygun değil - hızlıca oylanacak ve orada kapatılacak, bkz. Meta.programmers.stackexchange.com/questions/6483/… Önerilen okuma: Programmers.SE'de neler oluyor? Yığın Taşması Rehberi
sivrisinek

1
@gnat Bu sayfa, Programcılar Stack Exchange için neyin konu üzerinde olup olmadığı konusunda beni hala belirsiz bıraksa da, gönderen yazarın ilk önce doğrudan alakalı bir Wikipedia makalesini okuyan minimum eşiğini anlayabilir ve kabul edebilirim . Yığın Değişiminde talep edilen aynı türde yoğunlaştırılmış veya özet genel bakış.
Basil Bourque

2
Başlık geniş ve alt sorular aynı anda birden fazla soru soruyor -_- TomTom, P ரதீப், greg-449, bummi ve Nit bunu nasıl istiyor? Lütfen açıkla. Kısıtlamalar hakkında sorabileceğiniz herhangi bir şey var mı ...?
Lealo

Sorulara yönelik duyguların çok pano ve fikir temelli olduğunu anlasam da, wikipedia makalesini ilk okumanın gerekliliğine katılmıyorum. "Aynı türden yoğunlaştırılmış veya özet genel bakış" sağlamaz. Kabul edilen cevap, yukarıdaki wikipedia bağlantısından çok daha yoğun ve yerinde bir cevap sağlar.
Her zaman

Yanıtlar:


118

Kısıtlamalar, bir veritabanı şeması tanımının parçasıdır.

Bir kısıtlama genellikle bir tabloyla ilişkilendirilir ve bir CREATE CONSTRAINTveya CREATE ASSERTIONSQL ifadesiyle oluşturulur.

Bir veritabanındaki verilerin uyması gereken belirli özellikleri tanımlarlar. Bir sütuna, bütün bir tabloya, birden fazla tabloya veya bütün bir şemaya uygulanabilirler. Güvenilir bir veritabanı sistemi, kısıtlamaların her zaman geçerli olmasını sağlar (muhtemelen bir işlemin içinde, sözde ertelenmiş kısıtlamalar için).

Yaygın kısıtlama türleri şunlardır:

  • boş değil - bir sütundaki her değer NULL olmamalıdır
  • benzersiz - belirtilen sütun (lar) daki değerler tablodaki her satır için benzersiz olmalıdır
  • birincil anahtar - belirtilen sütun (lar) daki değerler tablodaki her satır için benzersiz olmalı ve NULL olmamalıdır ; normalde bir veritabanındaki her tablonun bir birincil anahtarı olmalıdır - bu, tek tek kayıtları tanımlamak için kullanılır
  • yabancı anahtar - belirtilen sütun (lar) daki değer (ler) başka bir tablodaki mevcut bir kayda başvurmalıdır ( birincil anahtarı veya başka bir benzersiz kısıtlama yoluyla )
  • check - kısıtlamanın karşılanması için doğru olarak değerlendirilmesi gereken bir ifade belirtilir

3
PK dahil olmak üzere +1, null değil, null
gbn

+1, yine de FOREIGN KEY senaryolarını genişletebilir ve bazı bağlantılar sağlayabilirsiniz.
mantıksızlık

2
Kontrol Kısıtlamaları yanlış olarak değerlendirilmemelidir. Doğru olmak zorunda değiller. Bilinmeyen de iyidir.
Martin Smith

2
Bir tür kısıtlaması da yaygın bir tür olmaz mıydı?
Martin

1
Bunlara genellikle kısıtlar demesek de, veri türünün bir kısıtlama biçimi olduğunu iddia ediyorum. Bir şeyi Int veya datetime olarak tanımlarsam, bu alana konulabilecek veri türünü kısıtlar. Doğru veri türü seçimi, veri bütünlüğünü sağlamanın kritik bir parçasıdır.
HLGEM

36

Neden kısıtlamalara ihtiyacımız olduğunu anlamak için önce veri bütünlüğünün değerini anlamalısınız.

Veri Bütünlüğü, verilerin geçerliliğini ifade eder. Verileriniz geçerli mi? Verileriniz onları tasarladığınız şeyi mi temsil ediyor?

Size sorduğum tuhaf soruları düşünebilirsiniz, ama ne yazık ki çoğu zaman, veritabanları gereksiz verilerle, diğer tablolardaki satırlara geçersiz referanslar, çoktan gitmiş ... ve iş mantığına hiçbir şey ifade etmeyen değerler artık çözümünüz.

Tüm bu çöpler tek başına performansınızı düşürmeye eğilimli değildir, aynı zamanda uygulama mantığınız altında bir saatli bombadır ve sonunda anlaşılması için tasarlanmayan verileri geri alır.

Kısıtlamalar, tasarım sırasında oluşturduğunuz ve verilerinizin bozulmasını önleyen kurallardır. Bir veritabanı çözümünün kalp çocuğunuzun uzun süre hayatta kalması için çok önemlidir. Kısıtlamalar olmadan çözümünüz kesinlikle zamanla ve yoğun kullanımla azalacaktır.

Veritabanı tasarımınızı tasarlamanın, çözümünüzün yalnızca doğuşu olduğunu kabul etmelisiniz. Bundan sonra (umarım) uzun bir süre yaşaması ve son kullanıcılarının (yani, istemci uygulamaları) her türlü (garip) davranışına katlanması gerekir. Ancak geliştirmedeki bu tasarım aşaması, çözümünüzün uzun vadeli başarısı için çok önemlidir! Saygı duyun ve ona gereken zamanı ve dikkati gösterin.

Bilge bir adam bir keresinde şöyle demişti: "Veri kendini korumalıdır!" . Ve bu, kısıtlamaların yaptığı şeydir. Veritabanınızdaki verileri mümkün olduğunca geçerli tutan kurallardır.

Bunu yapmanın birçok yolu vardır, ancak temelde şu şekilde özetlenebilir:

  • Yabancı anahtar kısıtlamaları muhtemelen en çok kullanılan kısıtlamadır ve diğer tablolara referanslara yalnızca başvurulacak bir hedef satır gerçekten varsa izin verilmesini sağlar. Bu ayrıca, başvurulan satırı silerek ölü bir bağlantı oluşturarak böyle bir ilişkinin kesilmesini imkansız kılar.
  • Kısıtlamaları kontrol et , belirli bir sütunda yalnızca belirli değerlere izin verilmesini sağlayabilir. Bir VARCHAR sütununda yalnızca "Sarı" veya "Mavi" kelimesine izin veren bir kısıtlama oluşturabilirsiniz. Diğer tüm değerler bir hata verir. Denetim kısıtlamalarının kullanımı için fikir alın sys.check_constraintsAdventureWorks örnek veritabanındaki görünümü kontrol edin
  • SQL Server'daki kurallar yalnızca yeniden kullanılabilir Kontrol Kısıtlamalarıdır (sözdizimini tek bir yerden korumanıza olanak tanır ve kısıtlamalarınızı diğer veritabanlarına dağıtmayı kolaylaştırır)

Burada ima ettiğim gibi, veritabanı tasarımınız için en iyi ve en savunmacı kısıtlama yaklaşımını oluşturmak için bazı kapsamlı hususlar gerekir. Öncelikle yukarıdaki farklı kısıtlama türlerinin olanaklarını ve sınırlamalarını bilmeniz gerekir. Daha fazla okuma şunları içerebilir:

YABANCI ANAHTAR Kısıtlamaları - Microsoft

Yabancı anahtar kısıtlaması - w3schools

KONTROL Kısıtlamaları

İyi şanslar! ;)


Bir necro-yorum olarak, görünen o ki kurallar artık Microsoft tarafından dışlanıyor.
gary

6

Kısıtlamalar, verilerdeki kurallardan başka bir şey değildir. Hangi verilerin geçerli ve neyin geçersiz olduğu kısıtlamalar kullanılarak tanımlanabilir. Böylece verilerin bütünlüğü korunabilir. Yaygın olarak kullanılan kısıtlamalar şunlardır:

  1. Birincil Anahtar : Verileri benzersiz şekilde tanımlayan. Bu kısıtlama belirli bir sütun için belirtilmişse, o sütuna yinelenen veriler giremeyiz
  2. Kontrol edin : Gibi NOT NULL. Burada söz konusu sütun için hangi verileri girebileceğimizi ve bu sütun için neyin beklenmediğini belirleyebiliriz.
  3. Yabancı anahtar : Diğer tablonun satırına yabancı anahtar referansları. Böylece, bir tabloda başka bir tablodan atıfta bulunulan veriler, referans tablosu için her zaman kullanılabilir.

3

Kısıtlamalar, verilerin belirli özelliklerini zorlamak için kullanılabilir. Basit bir örnek, int sütununu [0-100000] değerleriyle sınırlandırmaktır. Bu giriş iyi görünüyor.


3

Kısıtlamalar, veritabanındaki veriler için hangi değerlerin geçerli olduğunu belirler. Örneğin, bir değerin boş olmamasını (bir NOT NULLkısıtlama) veya başka bir tabloda benzersiz bir kısıtlama olarak var olmasını ( FOREIGN KEYkısıtlama) veya bu tabloda benzersiz olmasını ( gereksinimlerinize bağlı olarak bir UNIQUEkısıtlama veya belki de PRIMARY KEYkısıtlama ) uygulayabilirsiniz . ). Kısıtlamalar kullanılarak daha genel kısıtlamalar uygulanabilir CHECK.

SQL Server 2008 kısıtlamaları için MSDN belgelerine muhtemelen en iyi başlangıç yeridir.


2
  1. UNIQUEkısıtlama (bunun bir PRIMARY KEYkısıtlaması bir değişkendir). Belirli bir alanın tüm değerlerinin tablo genelinde benzersiz olup olmadığını kontrol eder. Bu- Xeksen kısıtlamasıdır (kayıtlar)

  2. CHECKkısıtlama (bunun bir NOT NULLkısıtlaması bir değişkendir). İfade için aynı kaydın alanları üzerinde belirli bir koşulun geçerli olup olmadığını kontrol eder. Bu, Y-eksen kısıtlamasıdır (alanlar)

  3. FOREIGN KEYkısıtlama. Bir alanın değerinin başka bir tablodaki bir alanın değerleri arasında bulunup bulunmadığını kontrol eder. Bu, Z-axis kısıtlamasıdır (tablolar).


Benzersiz kısıtlamalar ve yabancı anahtar kısıtlamaları, kısıtlamalar kullanılarak yazılabilir, CHECKöyleyse neden farklı olarak sınıflandıralım? yani " Y-eksen" (ne anlama geliyorsa).
24'te bir gün

2
@onedaywhen: FOREIGN KEYBir CHECKkısıtlama kullanarak nasıl uygularsınız ?
Quassnoi

1
@onedaywhen: bu kısıtlamaya sahip bir tablo oluşturmayı deneyin.
Quassnoi

1
@onedaywhen: denemek çok mu zor? İpucu: bu işe yaramayacak.
Quassnoi

3
@onedaywhen: yazdığınız sorgu bir kontrol kısıtlaması oluşturmuyor. Bu sadece bir SELECTsorgu. İçindeki CHECKkısıtlamalarda alt sorgular (veya geçerli kaydın dışındaki değerlere başvuran diğer yapıları) kullanamazsınız SQL Server.
Quassnoi

2

Veritabanı, bir dizi gayri resmi iş kuralından oluşan kavramsal (veya iş) modelin bilgisayarlı mantıksal temsilidir. Bu kurallar, verilerin kullanıcı tarafından anlaşılan anlamıdır. Bilgisayarlar yalnızca resmi temsilleri anladığından, iş kuralları doğrudan bir veritabanında temsil edilemez. Resmi bir temsille, bir dizi bütünlük kısıtlamasından oluşan mantıksal bir modelle eşleştirilmelidirler. Bu kısıtlamalar - veritabanı şeması - iş kurallarının veritabanındaki mantıksal temsillerdir ve bu nedenle, verilerin DBMS tarafından anlaşılan anlamıdır. DBMS, iş kurallarını temsil eden tüm kısıtlamaların farkında değilse ve / veya uygulamıyorsa, verilerin ne anlama geldiğine dair eksik bir anlayışa sahiptir ve bu nedenle

Not: DBMS - "anlaşılan" anlamı - bütünlük kısıtlamaları - kullanıcı tarafından anlaşılan anlamla - iş kuralları - aynı değildir, ancak bazı anlamların yitirilmesine rağmen, verilerden mantıksal çıkarımları mekanikleştirme becerisi kazanırız.

Fabian Pascal'dan "Eski Bir Hata Sınıfı"


2

SQL'de temel olarak 4 tür ana kısıtlama vardır:

  • Etki Alanı Kısıtlaması: yeni bir demet için sağlanan öznitelik değerlerinden biri belirtilen öznitelik etki alanında değilse

  • Anahtar Kısıtlaması: Yeni bir demetteki bir anahtar özniteliğinin değeri, ilişkideki başka bir dizide zaten mevcutsa

  • Referans Bütünlüğü: Yeni bir demetteki yabancı anahtar değeri, başvurulan ilişkide bulunmayan bir birincil anahtar değerine başvuruyorsa

  • Varlık Bütünlüğü: Yeni bir tuple'da birincil anahtar değeri boşsa


-1

kısıtlamalar, belirli bir koşulu doğrulayabilen koşullardır. Veritabanıyla ilgili kısıtlamalar; Etki Alanı bütünlüğü, Varlık bütünlüğü, Bilgi Bütünlüğü, Kullanıcı Tanımlı Bütünlük kısıtlamaları vb .'dir.

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.