İlişkisel veritabanları bu durumu mükemmel bir şekilde ele almak için inşa edilmemiştir. Sizin için neyin en önemli olduğuna karar vermeli, sonra da takaslarınızı yapmalısınız. Birkaç hedefiniz var:
- Üçüncü normal formu koru
- Referans bütünlüğünü koruyun
- Her hesabın bir şirkete veya gerçek bir kişiye ait olduğu kısıtlamasını koruyun.
- Verileri basit ve doğrudan alma yeteneğini koruyun
Sorun şu ki, bu hedeflerin bazıları birbiriyle rekabet ediyor.
Alt Yazma Çözümü
Hem şirketleri hem de kişileri içeren bir süper tür oluşturduğunuz bir alt yazma çözümü seçebilirsiniz. Bu süper-tip muhtemelen alt-tipin doğal anahtarının bir bileşik anahtarına ve bir bölümleme özelliğine (örneğin customer_type
) sahip olacaktır. Bu normalleşmeye kadar iyidir ve referans bütünlüğünü ve kurumların ve kişilerin birbirini dışlayan kısıtlarını uygulamanızı sağlar. Sorun, customer_type
hesabın hesabına ne zaman katıldığınıza bağlı olarak her zaman şube açmanız gerektiğinden, bu durum veri alımını zorlaştırır . Bu muhtemelen UNION
sorgunuzda çok sayıda tekrarlanan SQL kullanmak ve kullanmak demektir .
İki Yabancı Anahtar Çözümü
Hesap tablonuzda, biri şirkete diğeri de kişi olmak üzere iki yabancı anahtarı saklayabileceğiniz bir çözüm seçebilirsiniz. Bu çözüm aynı zamanda referans bütünlüğünü, normalleştirmeyi ve karşılıklı münhasırlığı korumanızı sağlar. Ayrıca, alt yazma çözümüyle aynı veri alma dezavantajına sahiptir. Aslında, bu çözüm, birleştirme mantığınızı "daha erken" dallandırma problemine girmeniz dışında, alt-yazma çözümü gibidir.
Bununla birlikte, birçok veri modelcisi, karşılıklı münhasırlık kısıtlamasının uygulanması nedeniyle bu çözümü alt yazma çözümünden daha düşük olarak değerlendirecektir. Alt yazma çözümünde, karşılıklı münhasırlığı uygulamak için anahtarları kullanırsınız. İki yabancı anahtar çözümünde bir CHECK
kısıtlama kullanırsınız . Çek kısıtlamalarına karşı haksız önyargısı olan bazı insanlar tanıyorum. Bu insanlar, kısıtlamaları anahtarlarda tutan çözümü tercih ederler.
"Denormalized" Bölümleme Öznitelik Çözümü
Chequing hesap tablosunda tek bir yabancı anahtar sütunu tuttuğunuz ve yabancı anahtar sütununu nasıl yorumlayacağınızı söylemek için başka bir sütun kullandığınız başka bir seçenek daha var (RoKaOwnerTypeID
kolonu). Bu esas olarak alt tablolamadaki süper tip tabloyu, alt tabloya bölümleme niteliğini denormalize ederek ortadan kaldırır. (Bölümleme özniteliği birincil anahtarın bir parçası olduğu için bunun biçimsel tanıma göre kesinlikle "denormalizasyon" olmadığını unutmayın.) Bu çözüm, aynı şeyi yapmak için fazladan bir tabloya sahip olmaktan kaçındığı için oldukça basit görünüyor ve yabancı anahtar sütunlarının sayısını bire indirir. Bu çözüm ile sorunu alma mantığın dallanma önlemek etmez ve dahası, bu sürdürmek için izin olmamasıdır deklaratif bilgi tutarlılığı. SQL veritabanları, birden çok üst tablodan biri için olan tek bir yabancı anahtar sütununu yönetme yeteneğine sahip değildir.
Paylaşılan Birincil Anahtar Alan Adı Çözümü
İnsanların bazen bu sorunla ilgilenmesinin bir yolu, bir alt türe veya diğerine ait olsun, herhangi bir kimlik için karışıklık olmaması için tek bir kimlik havuzu kullanmaktır. Bu, bir banka senaryosunda doğal olarak işe yarayacaktır, çünkü hem bir şirkete hem de gerçek bir kişiye aynı banka hesap numarasını vermeyeceksiniz. Bunun avantajı, bir bölümleme özelliğine ihtiyaç duyulmamasıdır. Bunu süper tip bir tabloyla veya tablo olmadan yapabilirsiniz. Süper tür bir tablo kullanmak, benzersizliği zorunlu kılmak için bildirici kısıtlamalar kullanmanızı sağlar. Aksi takdirde, bunun usule uygun olarak uygulanması gerekir. Bu çözüm normalleştirilmiştir, ancak süper tür tablosunu tutmadığınız sürece bildirici başvuru bütünlüğünü korumanıza izin vermez. Hala karmaşık geri alma mantığından kaçınmak için hiçbir şey yapmıyor.
Bu nedenle, tüm kurallara uyan temiz bir tasarıma sahip olmanın ve aynı zamanda veri alımınızı basit tutmanın gerçekten mümkün olmadığını görebilirsiniz. Ödüllerinizin nerede olacağına karar vermelisiniz.
OwnerTypeID
içindeChecquingAccount
olan, masa1=Corporation
ve2=NaturalPerson
? Eğer sadece bir ihtiyaç BöyleceOwnerID
içindeChecquingAccount
masa, birlikte olabildiğince hangi indeksOwnerTypeID
.