Birbirine özgü birkaç birebir ilişkiye sahip olmak kötü bir uygulama mıdır?


38

De ki, bir masa cartablolara bire bir ilişki vardır electric_car, gas_carve hybrid_car. Bir ederse carolduğunu electric_car, artık görünebilir gas_carveya hybrid_carvs.

Bu tasarımda yanlış olan bir şey var mı? Yolun aşağısında oluşabilecek bazı sorunlar?

Yanıtlar:


59

Farklı otomobil tipleri, veri modellemede tekrar tekrar yüzeylenen genel bir sorun örneğidir. ER modellemesinde "genelleme / uzmanlık" ve nesne modellemesinde "üst sınıf / alt sınıf" olarak adlandırılır.

Bir nesne modelleyici, problemi kolayca çözmek için nesne modelinde yerleşik miras özelliklerini kullanır. Alt sınıflar sadece üst sınıfı genişletir.

İlişkisel modelleyici bir sorunla karşı karşıyadır. mirastan elde edilecek faydaları taklit edecek şekilde tabloları nasıl tasarlayabilirim?

En basit teknik tek masa mirası olarak adlandırılır . Tüm araba tipleri hakkındaki veriler, araçlar için tek bir tablo halinde gruplandırılmıştır. Tek bir türdeki bütün arabaları bir araya toplayan car_type bir sütun var. Hiçbir araba birden fazla tipe ait olamaz. Bir sütunun, örneğin elektrikli otomobillerle ilgisi yoksa, elektrikli otomobillerle ilgili satırlarda NULL bırakılacaktır .

Bu basit çözüm, küçük ve basit durumlar için iyi sonuç verir. Çok sayıda NULL varlığı, ek yükü depolamaya küçük bir miktar ve ek yükü almak için biraz ekler. Boolean sınamaları, boş sütunlarda yapılırsa, geliştiricinin SQL üç değerli mantığını öğrenmesi gerekebilir . Bu başlangıçta şaşırtıcı olabilir, ama buna alışır.

Sınıf tablosu mirası adı verilen başka bir teknik var . Bu tasarımda, hepsi için kombine bir masaya ek olarak, gas_car, electric_car ve hybrid_car için ayrı masalar var. Belirli bir araba türüyle ilgili tüm verileri istediğinizde, uygun masaya sahip araç masasına katılırsınız. Bu tasarımda daha az NULL var, ama daha çok katılıyorsunuz. Bu teknik daha büyük ve daha karmaşık durumlarda daha iyi çalışır.

Paylaşılan birincil anahtar adı verilen üçüncü bir teknik var. Bu teknik, genellikle sınıf tablosu mirası ile birlikte kullanılır. Alt sınıflar için özel tablolarda, birincil anahtar olarak, araba tablasındaki karşılık gelen girişin ana anahtarının bir kopyası bulunur. Bu kimlik sütununun hem birincil anahtar hem de yabancı anahtar olduğu bildirilebilir.

Bu, yeni araba ekleneceği zaman fazladan bir programlama gerektiriyor, ancak birleşimleri basit, kolay ve hızlı hale getiriyor.

Süper sınıflar ve alt sınıflar gerçek dünyada her zaman olur. Korkma Ancak, ilk tasarımınızı performans açısından test edin. İlk girişiminiz basit ve sağlamsa, hızlandırmak için ince ayar yapabileceksiniz.


3
Vay, teşekkür ederim! Anlamaya çalıştığım şeyin noktası bu. Sınıf masada kalıtım tam ihtiyacım olan şey gibi gözüküyor. Gelecekteki okuyucular için kabul ettiğim cevabı değiştirdim, çünkü sadece davamı değil, soruyu tamamen kapsadığını düşünüyorum.
Arthur Tarasov

6
Mükemmel cevap burada. Bir ipucu: Bu tasarım kararlarını iyice belgeleyin. Hangi rotayı kullanıyorsanız kullanın, birisi veritabanı yapısını incelerken belli olmaz . Postgres gibi bazı veritabanları , yorumlarınızı sütunlarınızın, tablolarınızın ve diğer verilerinizin meta verileriyle ilişkilendirmenizi sağlar.
Basil Bourque,

Elektrikli arabaları melez araçlardan uzak tutma konusundaki kısıtlamaları ele almazsınız. Bunun için ayrı bir masaya ihtiyacınız var.
jmoreno

2
Haklısın. Arabalar tablosuna bir car_type alanı eklerseniz, arabaları normalizasyondan sapma pahasına yalnızca bir türe ait olacak şekilde sınırlayabilirsiniz. İyi bir DBMS, bir otomobilin birden fazla özel tabloya girilmesini önleyecek bir kontrol kısıtlaması tanımlamanıza izin verir. İçinde biraz yük var, yeni araba eklemeye gidiyorsunuz.
Walter Mitty

@WalterMitty ama bir car_typealan olmadan , veri alırken hangi tabloyu arayacağımı nasıl bilirsin? Belirli bir carkayıt hakkında hangisinin verileri olduğunu görmek için üç tabloyu da okumak zorunda mısınız?
Josh Part,

12

Modelinizde, modellemeye çalıştığınız verilerin gerçekliğini yansıtmak için gereken kadar varlık alt türüne sahip olmanın yanlış bir tarafı yoktur. Soru alt türlerin kötü bir uygulama olup olmadığı değildir. Sorun olabilir olmak bir olduğunu iyi bir model ?

Örneğin, örneğinize göre, bir eklenti hibrid olan Audi A4 eTron gibi bir şeyle ne yapıyorsunuz? Bu bir "elektrikli otomobil" mi, yoksa "hibrit bir araba" mı?

Kendine sorman gereken bir başka soru da neden altyazı yazıyorsun? Alt türlerinizde kaç belirgin öngörü vardır? Bu öngörülerden herhangi biri alt türler arasında paylaşılıyor mu? Durum karmaşıklaşabilir.

Alt yazma, sınıflandırma için veritabanı tasarımında kullanılmaz. Kodları, tabloları kodlamak için yabancı anahtarları veya bayrakları kullanarak sınıflandırma yapabilirsiniz. Alt yazma, ilgilenilen bir şeyin farklı türlerine yönelik farklı yüklem kümelerini modellemek için kullanılır. Alt türleri yalnızca sınıflandırma için kullanıyorsanız, bu kötü bir uygulamadır.

Alt türleriniz, veritabanınızın umursadığı şeyler için açık ve net bir şekilde farklı öngörü kümelerini modelliyorsa, kaç alt türe ihtiyacınız olursa olsun mükemmel bir uygulamadır.


Teşekkürler, kendim için bir çeşit tuzak kurmaya başladığımdan korktum. Benim sorunum alt türlerin her birinin çok fazla sütuna sahip olması. Bazıları üst üste gelecek ve ben onları bir carmasaya koyacağım , ancak çoğu alt tipi masaya koymayacak ve koymayacak. Örneğin, araba türlerinin temel parçalarını depolamak gibi bir şey olacaktır. Elektrikli otomobil motoru 100 parça, gazlı otomobil motoru 75 parça ve bir hibrit 125 parçaya sahip olabilir. 50 parça yaygın ve saklanan olurdu cars50, 25 ve 75 olacak iken, electric_car, gas_car, ve hybrid_cartablolar
Arthur Tarasov
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.