İlişkilerle ilgili bir sorununuz olduğunu düşünmüyorum. Bunun yerine sorun her tablo için yedek anahtarlar (yani Ids) kullanarak elde edilen veritabanı Sınıflandırma başka bir Bölüm iken bir Bölümü olan İşçilerin eklenmesini engelleyemez ve tersi olduğunu düşünüyorum. Bunu anlamanın iyi bir yolu şemayı bir ER Diyagramı aracı kullanarak görselleştirmektir. Ben kullanacağı Oracle Data Modeler ücretsiz olarak indirilebilir aracı.
ER Şeması
Haliyle, 2 şirketiniz olabilir - deyin IBM
ve Microsoft
. IBM
bir Software Development
departman olabilir ve Microsoft bir Desktop Software
departman olabilir. IBM'in bir Software Engineer
sınıflandırması olabilir ve Microsoft'un bir Software Developer
sınıflandırması olabilir. Şimdi, çünkü sizin için bir yedek anahtarınız var Department
ve Classification
bu Software Development
bir IBM
departman ve Desktop Software
bir Microsoft
departman olması, gelecekteki çocuk ilişkileri için kayboluyor. Bu da böyledir Classification
. Bu nedenle , departmanında Harlan Mills
bir IBM
çalışan olan, Software Development
sınıflandırması Software Developer
birMicrosoft
sınıflandırma! Aynı şekilde, işçiye doğru sınıflandırma ve yanlış departman verilebilir! İlk örneği gösteren bir diyagram:
1 Ids temsil eder IBM
ve 2 Ids temsil eder Microsoft
. Ben kırmızı senaryoda vurguladığınız nerede Harlan Mills
ve Bill Gates
tersi 200 sınıflandırma kimliği ve yardımcısı ilişkili 10 bölüm Id tarafından canlandırıldığı yanlış bölümler, atanır.
Çözülecek Seçenekler
Peki onun olmasını önlemek için seçenekler nelerdir? İki acil seçenek vardır. Birincisi, her tablo için bir yedek anahtar kullanarak bu sorunun var olduğunu fark etmek ve bunun gerçekleşmediğini doğrulamak için ek programlama getirmek. Bu uygulamada yapılabilir, ancak uygulama dışında ekler ve güncellemeler gerçekleşebilirse , yanlış ilişkilendirmeler yine de oluşabilir. Daha iyi bir yaklaşım, atanan bölümün atanan sınıflandırma ile aynı şirkette olduğundan emin olmak için bir çalışanın ekleme ve güncellemesini başlatan ve ekleme veya güncellemede başarısız olan bir tetikleyici oluşturmaktır.
İkinci seçenek, her tablo için yedek anahtar kullanmamaktır . Bunun yerine, yedek anahtarları yalnızca Company
temel olan ve ebeveynleri olmayan tablo için kullanın ve ardından ve alt tablolarıyla tanımlayıcı ilişkiler oluşturun . Ve tabloları artık bir PK var bunları ayırt etmek artı Sıra Numarası veya Ad. Daha sonra, gelen ilişkiler ve için de olmak ve böylece PK olur , ayrıca (bu örnekte bir sıra numarası kullanıyorum), artı . Sonuç sadece orada olduğu içinde masaya. Şimdi ise imkansız atama a kadarDepartment
Classification
Department
Classification
Company Id
Department
Classification
Worker
identifying
Worker
Company Id
Department Number
Classification Number
one
Company Id
Worker
Worker
bir Department
diğerine Company
ve Classification
diğerine Company
.
Bu neden imkansız? Bu imkansızdır çünkü şema Worker
ve Department
ve arasında referans bütünlüğü uygular Classification
. Birini diğerine ve diğerine Worker
a eklemek için girişimde bulunulursa , karşılık gelen üst tabloda bulunmayan kombinasyon referans bütünlüğü ihlali tetikler ve ekleme çalışmaz.Department
Company
Classification
İkinci seçeneğin uygulanmasının güncellenmiş bir şeması:
Tercih Edilen Seçenek
İki seçenekten, iki nedenden dolayı ikincisini - tanımlayıcı ilişkileri ve basamaklı tuşları kullanarak - kesinlikle tercih ederim. İlk olarak, bu seçenek ek bir programlama olmadan istenen kurala ulaşır. Bir tetikleyici geliştirmek önemsiz değildir. Kodlanmış, test edilmiş ve bakımı yapılmış olmalıdır. Performansı etkilememek için tetik mantığının optimum olmasını sağlamak da önemsiz değildir. Veritabanı Uzmanları için Uygulamalı Matematik kitabı , böyle bir çözümün karmaşıklığı hakkında birçok ayrıntı sunmaktadır. İkincisi, kurallar Bölümü ve Sınıflandırma ilişkin imalar değil bağlamında dışında var Company
şema artık daha doğru gerçek dünyayı yansıtır böylece, vb.
Bu harika bir soru, çünkü her tablonun neden bir yedek anahtar gerektirdiğini varsaymanın tam olarak neden kötü bir fikir olduğunu gösteriyor. Fabian Pascal bir sahip mükemmel blog yazısı sadece bir vekil anahtar aynı zamanda bazı alımlarını yaparak yol açabilecek veri bütünlüğü açısından kötü bir fikir olabilir değil gösteren sadece bu konu üzerine yavaşFiziksel düzeyde tam olarak, anahtarların düzgün bir şekilde basamaklandırılması gerektiğinde birleşme gerektiğinden gereksiz olacaktır. Bu sorunun ortaya koyduğu bir diğer ilginç konu, bir veritabanının içine eklenen tüm verilerin gerçek dünyaya göre doğru olduğundan emin olamamasıdır. Bunun yerine, yalnızca içine eklenen verilerin kendisine bildirilen kurallarla tutarlı olmasını sağlayabilir. Bu durumda biz basamaklı anahtarı yaklaşımını kullanarak mümkün olan en iyi yapabileceği sağlamak bir kuralına göre tutarlı veri tutabilir DBMS Worker
belirli bir bölgesinin Company
ihtiyaçlarına bir atanacak Classification
ve Department
o aynı Company
. Ancak, gerçek dünyada Microsoft
bir bölüm varsa Desktop Software
ancak veritabanının kullanıcısı bölümünSoftware Development
DBMS hiçbir şey yapamaz ancak gerçek bir gerçek verildiğini varsayar.