Neden birden fazla ilişki için bir tablom olmasın?


12

Veritabanımda örneğin Mağaza, Çalışan ve Satış gibi birden çok ilişkim olduğu ve çiftleri basit bir ikili ilişkiyle bağlamak istediğimi varsayarsak. Şahsen yabancı anahtarlardan oluşan doğal bir anahtarla Employee_Store ve Employee_Sale adlı tablolar yaratacağım.

Şimdi, meslektaşım birden fazla ilişki için bir tablo oluşturmakta ısrar ediyor. Yukarıdaki örnek için EmployeeLinks adında bir tablo olabilir:

EmployeeLinks(
    IdLink int PK, 
    IdEmployee int FK null,
    IdStore int FK null,
    IdSale int FK null,
    LinkType int not null
)

Lütfen bunun neden iyi bir fikir olmadığı konusunda iyi nedenlerle yardımcı olun. Kendi argümanlarım var ama onları gizli tutmak ve tarafsız görüşlerinizi duymak istiyorum.

DÜZENLE:

Başlangıçta yukarıdaki tabloda birincil anahtar (!) Bulunmaz. Yabancı anahtarlar null değerine izin verdiği için yedek anahtar tek seçenektir.


3
OTLT veya EAV gibi ama daha da kötüsü, çünkü satırlar yerine sütunları çoğaltır!
oneday24

Yanıtlar:


13

İş arkadaşınız bu bağlantı tablosu için birincil anahtar olarak ne öneriyor?
Birincil anahtar sütunları elbette NULL olamaz: yukarıdaki tabloda null değeri vardır.

Yukarıdaki örnekte herhangi bir doğal satır tanımlayıcısı (PK'nin ne olduğu) yoktur (IDENTITY sütunu birincil anahtar değildir), bu nedenle herhangi bir modelleme işleminde başarısız olur . Bazı modelsiz (ERD, ORM, IDEF1X, ne olursa olsun) tablo oluşturmayı bile düşünmeyin

Ayrıca 3 yollu bağlantınız olmadığından emin olmak için CHECK kısıtlamalarına da ihtiyacınız olacaktır.

Son olarak, 4. ve 5. normal form bölgelerine sapıyorsunuz, ancak yanlış nedenlerle.

İnternette herhangi bir örnek bulamıyorum: bunun ne kadar aptal olduğunu gösteriyor


4
+1 içinI can't find any examples on the internet: that shows how stupid this is
JNK

Birincil anahtar hakkında daha açık konuştum. Ayrıca, görünüşe göre meslektaşım daha önce böyle bir tasarıma rastladı, ya da bana söylendi
Tomasz Pluskiewicz

@Tomasz Pluskiewicz: Bir yedek anahtar birincil anahtar değildir! Uygulama sırasında doğal anahtarı tamamlamak için seçilir. Bkz. Dba.stackexchange.com/a/13779/630 Ayrıca, iş arkadaşınız bize bu tekniği gösteren yetkili bir makale göstermelidir.
Zamanımda

12

Aklıma gelen ilk pratik neden performans.

"Geleneksel" bir modelde, Idemployee, Idstorealanlar veya alanlar ne olursa olsun benzersiz bir dizine sahip olabilir ve aramalarda mükemmel performans elde edebilirsiniz. Ek parçaların bakımı da kolaydır. Benzersiz dizinler, birleştirmeleri daha sık birleştirmenizi sağlar, bu da çok fazla JOINhızlı hale getirebilir .

Örnek modelinizde, iyi bir performans elde etmek için, tablodaki her FK alanında minimum olarak tek bir alan endeksine, ideal olarak referans verilecek tüm kombinasyonlarda bir kaplama dizinine sahip olmanız gerekir, yani:

  • Çalışan / Mağaza
  • Çalışan / Satış

Linktype ne olduğundan emin değilim ama eğer başvurursanız, muhtemelen dizine alınmalıdır.

Alanın doldurulup doldurulmadığına bakılmaksızın, bu dizinlerin tablodaki her satır için korunması gerekir. Bir filtre ekleyebilirsiniz, ancak bu birçok kombinasyonla da zorlaşacaktır.

Ayrıca mantığınızı zorlaştıracaktır. Ya çalışan kimliği üzerinde bir arama yapmanız, boş bir mağaza değeri olan bir satır bulmanız ve güncellemeniz gerekir; veya her yeni bağlantı için alanları birleştirmeyi amaçlayan yeni bir satır ekleyin.

Temel olarak DAHA FAZLA disk alanı kullanacak, korumak için DAHA FAZLA dizine sahip olacak ve mantığınızı esasen hiçbir sebeple karmaşık hale getireceksiniz. Tek "yarar" başa çıkmak için daha az tablo olmasıdır.


LinkType sütunu bir ayrımcıdır. Sadece bir satırın aslında hangi çiftin ilgili olduğunu söylemek. Bana sorarsan sadece mekanizmaya ekler.
Tomasz Pluskiewicz

@TomaszPluskiewicz Ona neden berbat olduğunu göstermenin en iyi yolunun her iki tablodaki örnek bir veri kümesi oluşturmak ve bazı sorgular çalıştırmak olduğunu düşünüyorum. Modeli geleneksel bir modelden çok daha yavaş olacak
JNK

4

Bir tabloya birden çok ilişki koymak, bu ilişkiler aynı niteliklere sahipse ve / veya verileri birden çok ilişki üzerinden toplamak istiyorsanız yararlı olabilir.

İlişki türlerinin çalışma zamanında kullanıcı tarafından tanımlanması gerekir. Ancak bu nadiren durumdur.

Örneğinizde ilişkiler nitelikleri paylaşmaz, hatta iki farklı tabloya atıfta bulunan ilişkiler. Bu, kısıtlamaların uygulanmasını zorlaştırır ve tasarım da daha az sezgiseldir.

Bu tasarımı sadece tablolar oluşturmak paraya mal olsaydı seçerdim.

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.