Normalleştirme (veya Normalleştirme) nedir?


Yanıtlar:


171

Normalleştirme, temelde, yinelenen ve gereksiz verilerin önleneceği bir veritabanı şeması tasarlamaktır. Bazı veri parçalarının veritabanında birkaç yerde kopyalanması durumunda, verilerin bir yerde güncellenip diğerinde güncellenmemesi riski vardır ve bu da veri bozulmasına yol açar.

1. normal formdan 5. normal forma kadar bir dizi normalleştirme seviyesi vardır. Her normal form, genellikle fazlalıkla ilgili belirli bir problemden nasıl kurtulacağınızı açıklar.

Bazı tipik normalleştirme hataları:

(1) Bir hücrede birden fazla değere sahip olmak. Misal:

UserId | Car
---------------------
1      | Toyota
2      | Ford,Cadillac

Burada "Araba" sütunu (bir dizedir) birkaç değere sahiptir. Bu, her hücrenin yalnızca bir değere sahip olması gerektiğini söyleyen ilk normal biçimi rahatsız eder. Araba başına ayrı bir sıra oluşturarak bu sorunu ortadan kaldırabiliriz:

UserId | Car
---------------------
1      | Toyota
2      | Ford
2      | Cadillac

Bir hücrede birkaç değere sahip olmanın sorunu, güncellemenin zor olması, sorgulamanın zor olması ve dizinler, kısıtlamalar vb. Uygulayamamanızdır.

(2) Anahtar olmayan gereksiz verilere sahip olmak (yani veriler gereksiz yere birkaç satırda tekrarlanır). Misal:

UserId | UserName | Car
-----------------------
1      | John     | Toyota
2      | Sue      | Ford
2      | Sue      | Cadillac

Bu tasarım bir sorundur, çünkü ad her zaman KullanıcıKimliği tarafından belirlense de, ad her sütun için tekrarlanır. Bu, teorik olarak Sue adını bir satırda değiştirmeyi ve veri bozulması olan diğerini değiştirmeyi mümkün kılar. Sorun, tabloyu ikiye bölerek ve bir birincil anahtar / yabancı anahtar ilişkisi oluşturarak çözülür:

UserId(FK) | Car               UserId(PK) | UserName
---------------------          -----------------
1          | Toyota            1          | John
2          | Ford              2          | Sue
2          | Cadillac

Şimdi, UserId'ler tekrarlandığı için hala fazlalık veriye sahibiz gibi görünebilir; Bununla birlikte, PK / FK kısıtlaması, değerlerin bağımsız olarak güncellenememesini sağlar, böylece bütünlük güvenlidir.

Önemli mi? Evet çok önemli. Normalleştirme hataları olan bir veritabanına sahip olduğunuzda, veritabanına geçersiz veya bozuk verilerin girme riskini açarsınız. Veriler "sonsuza kadar yaşadığından", veri tabanına ilk girdiğinde bozuk verilerden kurtulmak çok zordur.

Normalleşmekten korkmayın . Normalizasyon seviyelerinin resmi teknik tanımları oldukça geniş. Normalleştirme karmaşık bir matematiksel süreçmiş gibi görünmesini sağlıyor. Bununla birlikte, normalleştirme temelde sadece sağduyudur ve sağduyu kullanarak bir veritabanı şeması tasarlarsanız, tipik olarak tamamen normalleştirileceğini göreceksiniz.

Normalleşmeyle ilgili bir dizi yanılgı vardır:

  • bazıları normalleştirilmiş veri tabanlarının daha yavaş olduğuna ve normalden arındırmanın performansı artırdığına inanıyor. Ancak bu yalnızca çok özel durumlarda geçerlidir. Tipik olarak normalleştirilmiş bir veritabanı da en hızlısıdır.

  • bazen normalleşme aşamalı bir tasarım süreci olarak tanımlanır ve "ne zaman duracağınıza" karar vermeniz gerekir. Ama aslında normalleştirme seviyeleri sadece farklı belirli sorunları tanımlar. 3. NF'nin üzerindeki normal formlar tarafından çözülen sorun, ilk etapta oldukça nadir görülen sorunlardır, bu nedenle, şemanızın zaten 5NF'de olma ihtimali vardır.

Veritabanları dışındaki herhangi bir şeye uygulanabilir mi? Doğrudan değil, hayır. Normalleştirme ilkeleri ilişkisel veritabanları için oldukça özeldir. Ancak genel temel tema - farklı örnekler senkronize değilse yinelenen verilere sahip olmamalısınız - geniş bir şekilde uygulanabilir. Bu temelde KURU prensibidir .


4
İlk normal için verdiğin örnek tam olarak doğru değil. İlk üç normal formu, yinelenen, gereksiz, bağımlı olmayan terimleriyle her zaman hatırlarım. Tekrarlanan veriler, acemi veritabanı geliştiricilerinin DogName1, DogName2, DogName3, vb. Gibi sütunları içeren tablo tanımları yazdıklarında ifade edilir
Bill

2
@Bill: Neden verdiğim örneğin doğru olmadığını düşünüyorsunuz? Örneğin uygun olacağı bir 1NF tanımı biliyor musunuz?
JacquesB

Nesne oryantasyonel programlamada normalleştirmeye nasıl ihtiyaç duyulmuyor - ancak sadece veritabanları söz konusu olduğunda? Bence hangi nesne oryantasyonel programlamasının tümüyle dışarıda kaldığının özüne yerleştirilmiş bir normalleştirme süreci var - değil mi?
Lealo

@Lealo Hayır, hiç de değil. Bir OO tasarımının durumunu her zaman önemsiz bir şekilde tablolarla "ilişkisel" bir veritabanı / tasarıma eşleyebilirsiniz - işte ORM budur - ancak elde ettiğiniz veritabanı / tasarım OO tasarımının ilişkisel bir temsili değil, ve sadece normalleşme yönetir ama OO yöntemleri elle uygun düzgün (belgesiz) (kompleks) kısıtlamaları ( "temsil değişmez") uygulamak zorunda olduğunu açıkça güncelleme anomaliler ve fazlalık tabi OO tasarım ilişkisel temsilidir.
philipxy

@Lealo: Prensip, OOP için, aynı bilgiyi (değişken biçimde) iki farklı nesnede asla bulundurmamanız gerektiği ölçüde geçerlidir, çünkü bunlar daha sonra senkronize olmayabilir.
JacquesB

45

Normalleştirme kuralları (kaynak: bilinmiyor)

  • Anahtar ( 1NF )
  • Tüm anahtar ( 2NF )
  • ve anahtardan başka bir şey yok ( 3NF )

... bana Codd'a yardım et .


12
Bunun uygun bir bağlam olmadan biraz belirsiz olduğunu düşünüyorum, değil mi?
Rik

3
Biraz belirsiz olabilir, ancak içeriğe sahip olanlar için harika bir hatırlatıcıdır. Normalleşmenin ne olduğunu ve nasıl devam edeceğimi biliyorum, ancak formların her birinin ne olduğunu asla hatırlayamıyorum.
Benjamin Autin

1
wikipedia bunu burada açıklıyor - "Anahtarın varlığını zorunlu kılmak, tablonun 1NF'de olmasını sağlar; anahtar olmayan özniteliklerin" anahtarın tamamına "bağımlı olmasını gerektirir; ayrıca anahtar olmayan özniteliklerin" hiçbir şeye bağlı olmamasını gerektirir " ancak anahtar "3NF'yi sağlar."
Kcats Wolfrevo

Wikipedia'ya göre kaynak Bill Kent'tir: "[Her] anahtarsız [öznitelik] anahtar, tüm anahtar ve anahtardan başka hiçbir şey hakkında bir bilgi sağlamalıdır."
apteryx

19

En önemlisi, veri tabanı kayıtlarından çoğaltmanın kaldırılmasına hizmet eder. Örneğin, bir kişinin adının gelebileceği birden fazla yeriniz (tablolarınız) varsa, adı ayrı bir tabloya taşır ve başka her yerde ona referans verirsiniz. Bu şekilde, daha sonra kişi adını değiştirmeniz gerekirse, yalnızca tek bir yerde değiştirmeniz gerekir.

Doğru veritabanı tasarımı için çok önemlidir ve teoride, veri bütünlüğünüzü korumak için mümkün olduğunca onu kullanmalısınız. Ancak birçok tablodan bilgi alırken performansınızı kaybedersiniz ve bu nedenle bazen performans açısından kritik uygulamalarda kullanılan normal olmayan veritabanı tablolarını (düzleştirilmiş olarak da adlandırılır) görebilirsiniz.

Tavsiyem, iyi derecede normalizasyonla başlamak ve sadece gerçekten ihtiyaç duyulduğunda normalizasyondan arındırmak

Not: Konu ve sözde normal formlar hakkında daha fazla bilgi edinmek için http://en.wikipedia.org/wiki/Database_normalization makalesine de bakın.


İşlemsel uygulamalarda gerçekte ne kadar az denormalizasyon gerektiğine de oldukça şaşıracaksınız. Veri modelini yaptığım bir canavar uygulamasında, 560 tablodan oluşan bir şemada yalnızca 4 adet normal olmayan veri vardı.
ConcernedOfTunbridgeWells

"Güncelleme anormalliklerini" önler. Bunu, belirli türdeki çoğaltmaları ortadan kaldırarak yapar.
S.Lott

"Benim tavsiyem, iyi derecede normalleşme ile başlamak ve sadece gerçekten ihtiyaç duyulduğunda normalizasyondan arındırma yapmaktır". Bu tek tavsiye çok kötü bir tavsiye! Hala bu "sözde teori" nin uygun bir örneğini göremedim. Eksi 1.
Philippe Grondier

7

Normalleştirme, bir tablodaki sütunlar arasındaki fazlalık ve işlevsel bağımlılıkları ortadan kaldırmak için kullanılan bir prosedür.

Genellikle bir sayı ile gösterilen birkaç normal form vardır. Daha yüksek bir sayı, daha az yedeklilik ve bağımlılık anlamına gelir. Herhangi bir SQL tablosu 1NF'dir (ilk normal form, hemen hemen tanım gereği) Normalleştirme, şemayı tersine çevrilebilir bir şekilde değiştirmek (genellikle tabloları bölümlemek), daha az fazlalık ve bağımlılıklar dışında işlevsel olarak aynı olan bir model vermek anlamına gelir.

Verilerin fazlalığı ve bağımlılığı istenmeyen bir durumdur çünkü verileri değiştirirken tutarsızlıklara yol açabilir.


5

Veri fazlalığını azaltmayı amaçlamaktadır.

Daha resmi bir tartışma için Wikipedia http://en.wikipedia.org/wiki/Database_normalization'a bakın.

Biraz basit bir örnek vereceğim.

Genellikle aile üyelerini içeren bir kuruluşun veritabanını varsayın

id, name, address
214 Mr. Chris  123 Main St.
317 Mrs. Chris 123 Main St.

normalleştirilebilir

id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27

ve bir aile masası

ID, address
27 123 Main St.

Neredeyse Tamamlanmış Normalleştirme (BCNF) genellikle üretimde kullanılmaz, ancak bir ara adımdır. Veritabanını BCNF'ye koyduğunuzda, bir sonraki adım genellikle sorguları hızlandırmak ve belirli ortak eklerin karmaşıklığını azaltmak için mantıksal bir şekilde normalize etmektir. Ancak, bunu önce düzgün bir şekilde normalleştirmeden iyi yapamazsınız.

Gereksiz bilginin tek bir girişe indirgenmesi fikri. Bu, özellikle Bay Chris'in adresini Ünite-7 123 Ana Cadde olarak gönderdiği ve Bayan Chris'in orijinal tabloda iki farklı adres olarak görünecek olan Suite-7 123 Ana Cadde'yi listelediği adresler gibi alanlarda yararlıdır.

Tipik olarak, kullanılan teknik, tekrarlanan öğeleri bulmak ve bu alanları benzersiz kimliklerle başka bir tabloda izole etmek ve tekrarlanan öğeleri yeni tabloya referans veren bir birincil anahtarla değiştirmektir.


1
BCNF "mükemmel" değildir. Tüm tablolarınızın yalnızca bir anahtar ve bir veri değeri olduğu 6NF'ye kadar daha yüksek normal formlar mevcuttur. Nadiren kullanılsa da
Rik

BCNF'nin nadiren kullanıldığına ve tipik olarak denormalize edildiğine katılmıyorum. Aslında normalleştirilmiş örneğiniz zaten BCNF'dedir ve onu normalleştirmezseniz, ilk kareye geri dönersiniz.
JacquesB

3

CJ Date'den alıntı yapmak: Teori pratiktir.

Normalleştirmeden sapmalar, veritabanınızda belirli anormalliklere neden olacaktır.

İlk Normal Formdan Ayrılma, erişim anormalliklerine neden olur, yani aradığınızı bulmak için ayrı değerleri ayrıştırmanız ve taramanız gerekir. Örneğin, değerlerden biri daha önceki bir yanıtla verilen "Ford, Cadillac" dizesi ise ve "Ford" un tüm tekrarlarını arıyorsanız, dizeyi kırıp açmanız ve şuna bakmanız gerekecektir. alt dizeler. Bu, bir dereceye kadar, verilerin ilişkisel bir veritabanında depolanması amacını ortadan kaldırır.

Birinci Normal Form'un tanımı 1970'ten beri değişti, ancak bu farklılıkların şimdilik sizi ilgilendirmesine gerek yok. İlişkisel veri modelini kullanarak SQL tablolarınızı tasarlarsanız, tablolarınız otomatik olarak 1NF'de olacaktır.

İkinci Normal Biçimden ve daha fazlasından ayrılma, güncelleme anormalliklerine neden olur, çünkü aynı gerçek birden fazla yerde saklanır. Bu sorunlar, var olmayan ve dolayısıyla icat edilmesi gereken diğer gerçekleri saklamadan bazı gerçekleri saklamayı imkansız kılar. Veya gerçekler değiştiğinde, kendisiyle çelişen bir veri tabanına sahip olmamanız için, bir olgunun depolandığı tüm alanları bulmanız ve tüm bu yerleri güncellemeniz gerekebilir. Ve veritabanından bir satırı silmeye gittiğinizde, bunu yaparsanız, hala ihtiyaç duyulan bir gerçeğin depolandığı tek yeri sildiğinizi görebilirsiniz.

Bunlar mantıksal sorunlardır, performans sorunları veya alan sorunları değildir. Bazen dikkatli programlama yaparak bu güncelleme anormalliklerinin üstesinden gelebilirsiniz. Bazen (çoğu zaman) normal formlara bağlı kalarak ilk etapta sorunları önlemek daha iyidir.

Daha önce söylenenlerin değerine bakılmaksızın, normalizasyonun yukarıdan aşağıya bir yaklaşım değil, aşağıdan yukarıya bir yaklaşım olduğu belirtilmelidir. Verilerin analizinde ve ilk tasarımınızda belirli metodolojileri takip ederseniz, tasarımın en azından 3NF'ye uygun olacağı garanti edilebilir. Çoğu durumda tasarım tamamen normalleştirilecektir.

Normalleştirme altında öğretilen kavramları gerçekten uygulamak isteyebileceğiniz yer, size eski bir veri tabanından veya kayıtlardan oluşan dosyalardan eski veriler verildiğinde ve veriler, normal formlar ve ayrılmanın sonuçları tamamen göz ardı edilerek tasarlandığı zamandır. onlardan. Bu durumlarda normalizasyondan sapmaları keşfetmeniz ve tasarımı düzeltmeniz gerekebilir.

Uyarı: Normalleştirme, sanki tam normalleşmeden her ayrılma bir günah, Codd'a karşı bir suçmuş gibi, genellikle dini imalarla öğretilir. (orada küçük kelime oyunu). Bunu satın alma. Veritabanı tasarımını gerçekten, gerçekten öğrendiğinizde, yalnızca kurallara nasıl uyacağınızı değil, aynı zamanda onları çiğnemenin ne zaman güvenli olduğunu da bileceksiniz.


2

Normalleştirme temel kavramlardan biridir. Bu, iki şeyin birbirini etkilemediği anlamına gelir.

Veritabanlarında özellikle, iki (veya daha fazla) tablonun aynı verileri içermediği, yani herhangi bir fazlalığa sahip olmadığı anlamına gelir.

İlk bakışta bu gerçekten iyi çünkü bazı senkronizasyon problemleri yapma şansınız sıfıra yakın, her zaman verilerinizin nerede olduğunu biliyorsunuz, vb. Ancak, muhtemelen, tablo sayınız artacak ve verileri geçmekte problem yaşayacaksınız. ve bazı özet sonuçlar almak için.

Böylece, sonunda biraz fazlalıkla (bazı olası normalleştirme seviyelerinde olacak) tamamen normalize edilmemiş veritabanı tasarımını bitireceksiniz.


2

Normalleştirme nedir?

Normalleştirme bize de o şekilde veritabanı tabloları ayrıştırmak sağlayan akıllıca bir adım resmi bir işlemdir veri fazlalığı ve güncelleme anomaliler en aza indirilmiştir.

Normalleştirme Süreci İzniyle
görüntü açıklamasını buraya girin

İlk normal biçim, ancak ve ancak her özniteliğin etki alanı yalnızca atomik değerler içeriyorsa (bir atomik değer, bölünemeyen bir değerdir) ve her özniteliğin değeri, o etki alanından yalnızca tek bir değer içeriyorsa (örnek: - için etki alanı cinsiyet sütunu: "M", "F".).

İlk normal biçim şu kriterleri uygular:

  • Tek tek tablolarda yinelenen grupları ortadan kaldırın.
  • Her bir ilgili veri kümesi için ayrı bir tablo oluşturun.
  • Her bir ilgili veri kümesini bir birincil anahtarla tanımlayın

İkinci normal biçim = 1NF + kısmi bağımlılık yok yani, anahtar olmayan tüm özellikler, birincil anahtara tamamen işlevseldir.

Üçüncü normal biçim = 2NF + geçişli bağımlılık yok yani anahtar olmayan tüm öznitelikler, yalnızca birincil anahtara DOĞRUDAN tamamen işlevsel bağımlıdır.

Boyce – Codd normal formu (veya BCNF veya 3.5NF), üçüncü normal formun (3NF) biraz daha güçlü bir versiyonudur.

Not: - İkinci, Üçüncü ve Boyce – Codd normal formları, işlevsel bağımlılıklar ile ilgilidir. Örnekler

Dördüncü normal biçim = 3NF + Birden Çok Değerli bağımlılıkları kaldırın

Beşinci normal biçim = 4NF + birleştirme bağımlılıklarını kaldır


0

Martin Kleppman'ın Veri Yoğun Uygulamaları Tasarlamak kitabında dediği gibi:

İlişkisel model üzerine literatür, birkaç farklı normal formu birbirinden ayırır, ancak ayrımlar pratik açıdan pek ilgi çekmez. Genel bir kural olarak, tek bir yerde saklanabilecek değerleri kopyalıyorsanız, şema normalize edilmez.


-10

Yinelenen (ve daha kötüsü, çakışan) verilerin önlenmesine yardımcı olur.

Yine de performans üzerinde olumsuz bir etkisi olabilir.


Hem normalleştirilmiş hem de normalleştirilmemiş verilerle çalıştığım için, uygulamayı veya veritabanını kaybetmektense veya sürdürmekte zorlanmaktansa normalleştirme ile hız düşüşünü tercih ediyorum.
Schalk Versteeg

1
modern veritabanı motorları, genellikle normalleştirilmiş veritabanlarını normalize edilmemiş veritabanlarından daha verimli hale getiren önbelleğe alma kullanır. şüpheniz varsa ölçün.
Steven A.Lowe

1
Normal olmayan bir tasarım, belirli bir sorgu için daha hızlı olabilir, ancak normalleştirilmiş bir tasarım, çok daha çeşitli sorgular için makul performans sağlayarak bir uzlaşma sunar.
Bill Karwin

@ Bill, bir şekilde katılmıyorum. Tamamen normalleştirilmiş bir veritabanının performansa yardımcı olmasının tek yolu, sistemin fazlalık verilerle uğraşmak zorunda kalmasını önlemektir. Bunun dışında, performans açısından en kötü durumdur.
Brian Knoblauch

Bu cevap, mevcut cevaplara değer katmaz.
cimmanon
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.