Bir alt tipin alt tipini, birbirini dışlayan alt sınıflarla tip / alt tip tasarım modelinde uygulama


20

Giriş

Bu sorunun gelecekteki okuyucular için yararlı olması için karşılaştığım sorunu göstermek için genel veri modelini kullanacağım.

Veri modelimiz A, Bve şeklinde etiketlenecek 3 birimden oluşmaktadır C. İşleri basit tutmak için tüm nitelikleri tür olacaktır int.

Varlık Aözelliklerini aşağıdaki etti: D, Eve X;

Varlık Bözelliklerini aşağıdaki etti: D, Eve Y;

Varlığın Caşağıdaki nitelikleri vardır: Dve Z;

Tüm varlıklar ortak özniteliği paylaştığından D, tür / alt tür tasarım uygulamaya karar verdim .

Önemli: Varlıklar birbirini dışlar! Bu, varlığın A veya B veya C olduğu anlamına gelir.

Sorun:

Varlıklar Ave Bbaşka ortak bir niteliği var E, ancak bu özellik varlıkta mevcut değil C.

Soru:

Mümkünse tasarımımı daha da optimize etmek için yukarıda açıklanan özelliği kullanmak istiyorum.

Dürüst olmak gerekirse, bunu nasıl yapacağım ya da nerede denemeye başlayacağım konusunda hiçbir fikrim yok, bu nedenle bu yazı.

Yanıtlar:


6

Bu soru, tip / alt tip tasarım deseni uygulamamın (karşılıklı münhasır alt sınıflar için) uygulanmasının devamı olduğu sürece. , hangi kendisi bir devamıdır Değişken varlık ilişkisel tabloya nasıl dönüştürüleceğini bilmiyorum , soracağım: tam olarak ne optimize etmeye çalışıyorsunuz? Depolama? Nesne modeli? Sorgu karmaşıklığı? Performans sorgusu mu? Tüm yönleri aynı anda optimize edemeyeceğiniz için bir yönü diğerine optimize ederken değiş tokuşlar vardır.

Remus'un aşağıdaki hususlara tamamen katılıyorum :

  • Her bir yaklaşımın artıları ve eksileri vardır (yani sürekli mevcut "bu bağlıdır" faktörü) ve
  • İlk öncelik veri modelinin verimliliğidir (verimsiz bir veri modeli temiz ve / veya verimli uygulama kodu ile düzeltilemez)

Bununla birlikte, karşılaştığınız seçim, çoğu normalleşmeye en az normalleştirme sırasına göre düzenlenmiş aşağıdakiler arasındadır:

  • Etemel tip Tablosuna mal tanıtımı
  • birden çok alt tür Tabloda tutma
  • Tamamen normale Eile aynı düzeyde yeni, aracı alt sınıf tabloya dışarı C, o Ave Bdoğrudan alt sınıfları olacaktır ( MDCCL cevabı @ )

Her seçeneğe bakalım:

Özelliği Etemel tür Tablosuna taşıma

PRO'lar

  • Sorguları bu ihtiyacı için indirimli sorgu karmaşıklığı Eancak X, Yya Z.
  • Potansiyel olarak daha verimli ihtiyacı olduğunu sorgular için Edeğil X, Yya Zdolayı hiçbir (özellikle agrega sorguları) JOIN.
  • Üzerinde dizin oluşturma potansiyeli (D, E)(ve eğer öyleyse, böyle bir koşula izin veriliyorsa, (D, E)EntityType <> öğesinin potansiyel olarak bir Filtrelenmiş Dizin oluşturma olasılığı C)

Eksileri

  • EOlarak işaretlenemezNOT NULL
  • İhtiyaç ekstra CHECK CONSTRAINTbaz tipi masaya sağlamak için bu E IS NULLzaman EntityType = C(bu çok büyük bir sorun değil gerçi)
  • Veri modeli kullanıcılarının EntityType = olduğunda neden Eolması gerektiği NULLve hatta tamamen göz ardı edilmesi gerektiği konusunda eğitilmesi gerekir C.
  • ESabit uzunluklu bir tür olduğunda ve satırların büyük bir kısmı EntityType için C(yani Ebu nedenle kullanmama NULL) veSPARSE sütundaki seçeneği veya Kümelenmiş Dizin'deki Veri Sıkıştırma'yı kullanmamadan biraz daha az verimli
  • Temel tür tablosunda Ebulunması E, her satırın boyutunu artıracağından, veri sayfasına sığabilecek satır sayısını azaltacağından, gerekmeyen sorgular için potansiyel olarak daha az verimlidir . Ancak bu, EFILLFACTOR'un tam veri tipine, taban tipi tabloda kaç satır olduğuna vb. Bağlıdır.

EHer bir alt tür Tablosunda özelliği sakla

PRO'lar

  • Daha temiz veri modeli (diğer bir deyişle E, taban türü tablosundaki sütunun neden kullanılmaması gerektiği konusunda başkalarını eğitme konusunda endişelenmenize gerek yok çünkü "gerçekten orada değil")
  • Muhtemelen nesne modeline daha yakından benziyor
  • Sütunu NOT NULL, varlığın gerekli bir özelliği gibi işaretleyebilir
  • EntityType = (bu büyük bir kazanç olmasa da) olduğundan CHECK CONSTRAINTemin olmak için taban tipi tabloda fazladan gerek yokE IS NULLC

Eksileri

  • Bu özelliği almak için alt tür tablolara JOIN gerektirir
  • EKaç satır A+ Bvar aksine , JOIN nedeniyle, gerektiğinde potansiyel olarak biraz daha az verimli C.
  • Biraz daha zor / karmaşık varlıklar konusunu ele operasyonlar için Ave B(ve değil C aynı "tip" olarak). Tabii ki, gelebilen yapan bir Görünüm yoluyla bu soyut UNION ALLbir arasındaki SELECTiçin JOINed tablolar Ave başka SELECTiçin JOINed tablolar B. Bu, SELECT sorgularının karmaşıklığını azaltacaktır, ancak sorgularda INSERTve UPDATEsorgularda çok yararlı değildir .
  • Belirli sorgulara ve ne sıklıkta yürütüldüklerine bağlı olarak, bir dizin oluşturmanın (D, E)bir veya daha fazla sık kullanılan sorguya gerçekten yardımcı olacağı durumlarda potansiyel bir verimsizlik olabilir, çünkü bunlar birlikte endekslenemez.

ETaban sınıfı ve A& arasındaki aracı Tabloya normalleştirB

( @ MDCCL'nin cevabını koşullara bağlı olarak uygulanabilir bir alternatif olarak sevdiğimi lütfen unutmayın . Aşağıdakiler bu yaklaşımın katı bir eleştirisi olarak değil, elbette değerlendirerek bir perspektif - benimki - ekleme aracı olarak kastedilmektedir. Daha önce önerdiğim iki seçenekle aynı bağlamda. Bu, tam normalleştirme ile kısmi normalizasyonun mevcut yaklaşımı arasındaki göreceli fark olarak gördüğümü netleştirmeyi kolaylaştıracaktır.)

PRO'lar

  • veri modeli tamamen normalleştirilmiştir (RDBMS'lerin yapmak için tasarlandığı göz önüne alındığında, bununla ilgili yanlış bir şey olamaz)
  • gerek sorguları için sorgu karmaşıklığı azalır Ave Bancak C(yani iki sorguları için gerek aracılığıyla katıldı UNION ALL)

Eksileri

  • biraz daha fazla yer kaplar ( Bartablo kimliği çoğaltır ve yeni bir sütun vardır BarTypeCode) [önemsiz, ancak farkında olunması gereken bir şey]
  • Birine ek olarak sorgu karmaşıklığında hafif bir artış JOINya AdaB
  • İşlemin taban sınıfı tablosunda (yani ) [ihmal edilebilir, ancak dikkat edilmesi gereken bir şey] üzerinde biraz daha uzun süre açık olacağından , kilitleme için artırılmış yüzey alanı, çoğunlukla açık INSERT( DELETEYabancı Anahtarları işaretleyerek dolaylı olarak ele alınabilir ON CASCADE DELETE) Foo.
  • temel sınıf Tablosu içinde gerçek tür - Aveya B- doğrudan bilgi yok Foo; sadece veya Braşağıdakilerden hangisi olabileceğini bilir : AB

    Diğer bir deyişle, genel temel bilgiler üzerinden sorgular yapmanız gerekiyorsa, ancak varlık türüne göre kategorilere ayırmanız veya bir veya daha fazla varlık türünü filtrelemeniz gerekiyorsa, temel sınıf tablosunda yeterli bilgi yoktur, bu durumda tablo. Bu aynı zamanda sütunun endekslenmesinin etkinliğini de azaltacaktır .LEFT JOINBarFooTypeCode

  • A& Bvs ile etkileşimde tutarlı bir yaklaşım yok C:

    Yani, her varlık doğrudan temel sınıf tablosuyla ilişkiliyse, tam varlığı almak için yalnızca bir birleşim olacaksa, herkes veri modeliyle çalışma açısından daha hızlı ve kolay bir şekilde aşinalık oluşturabilir. Sorgulara / Saklı Yordamlara, onları daha hızlı geliştirmelerini ve hataların oluşma olasılığını azaltan ortak bir yaklaşım olacaktır. Tutarlı bir yaklaşım, gelecekte yeni alt türlerin eklenmesini daha hızlı ve daha kolay hale getirir.

  • zaman içinde değişen iş kurallarına daha az uyarlanabilir:

    Yani, şeyler her zaman değişir ve Etüm alt türler için ortak hale gelirse, temel sınıf Tablosuna geçmek oldukça kolaydır . Varlıkların doğasındaki değişiklikler bunu bir süre değer değişikliği yaparsa, ortak bir özelliği alt türlere taşımak da yeterince kolaydır. Bir alt türü iki alt türe ayırmak (yalnızca başka bir SubTypeIDdeğer oluşturmak ) veya iki veya daha fazla alt türü bir araya getirmek yeterince kolaydır . Tersine, Edaha sonra tüm alt türlerin ortak mülkiyeti haline gelirse ne olur ? Sonra Bartablonun ara katmanı anlamsız olurdu ve eklenen karmaşıklık buna değmez. Tabii ki, böyle bir değişikliğin 5 hatta 10 yıl içinde gerçekleşip gerçekleşmeyeceğini bilmek imkansızdır, bu nedenle Bartablo mutlaka, hatta büyük olasılıkla kötü bir fikir (bu yüzden " potansiyel olarak daha az uyarlanabilir" dedim ). Bunlar sadece dikkate alınması gereken noktalar; her iki yönde de kumar oynamaktır.

  • potansiyel olarak uygunsuz gruplama:

    Sırf Anlamı Emülkiyet varlık türleri arasında paylaşılır Ave Banlamına gelmez Ave B gerektiği araya toplanabilir. Bir şeylerin aynı görünmesi (yani aynı özellikler) aynı oldukları anlamına gelmez.

özet

Tıpkı bu özel duruma en iyi nasıl yaklaşılacağına / ne zaman karar verileceğine karar vermek gibi, veri modelinin kullanımının aşağıdaki yönlerini göz önünde bulundurmaya ve faydaların maliyetlerden daha ağır bastığından emin olmaya bağlıdır:

  • Her EntityType için kaç satıra sahip olacaksınız (ortalama büyümenin üzerinde olduğu varsayıldığında, yolda en az 5 yıla bakın)
  • Bu tabloların her biri (taban türü ve alt türler) 5 yıl içinde kaç GB olacak?
  • özel veri türü nedir E
  • sadece bir mülk mü yoksa birkaç, hatta birkaç mülk mü
  • hangi sorgulara ihtiyacınız olacak Eve ne sıklıkta yürütülecek
  • İhtiyacınız olmayan hangi sorgulara ihtiyacınız olacak Eve ne sıklıkta yürütülecek

EEn azından "daha temiz" olduğu için ayrı alt tip tablolarda tutmak için varsayılan eğilimi düşünüyorum . Ben hareketli dikkate alacağını EEĞER baz tipi tabloya: satırların çoğu vardı değil bir EntityType için C; ve sıraların sayısı en azından milyonlardaydı; ve gerekli Eolan sorguları ve / veya bir dizindeki bir dizinden faydalanacak olan sorguları (D, E)çok sık yürütüyorum ve / veya dizine sahip olmak, genel kaynak kullanımını azaltacak veya en azından engelleyecek şekilde yeterli sistem kaynağı gerektirecek kaynak tüketiminde kabul edilebilir seviyelerin üzerine çıkan veya aşırı blokaja ve / veya kilitlenme artışlarına neden olacak kadar uzun süren artışlar.


GÜNCELLEME

OP bu cevaba şöyle yorum yaptı :

İşverenlerim iş mantığını değiştirerek E'yi tamamen ortadan kaldırdı!

Bu değişiklik özellikle önemlidir, çünkü yukarıda " ETaban sınıfı ve A& B" bölümü arasındaki "6. tabloya normalleştir" tablonun "CONs" alt bölümünde (6. madde işareti) tam olarak ne olabileceğini tahmin ediyorum . Özel sorun, bu tür değişiklikler meydana geldiğinde (ve her zaman yapar) veri modelini yeniden düzenlemenin ne kadar kolay / zor olduğudur. Bazıları herhangi bir veri modelinin yeniden düzenlenebileceğini / değiştirilebileceğini savunur, bu yüzden ideale başlayın. Ancak teknik düzeyde her şeyin yeniden düzenlenebilir olduğu doğru olsa da , durumun gerçekliği bir ölçek meselesidir.

Kaynaklar sonsuz değildir, sadece CPU / Disk / RAM değil, aynı zamanda geliştirme kaynakları da vardır: zaman ve para. Bu kaynaklar çok sınırlı olduğu için işletmeler sürekli olarak projelere öncelik vermektedir. Oldukça sık (en azından tecrübelerime göre), verimlilik kazanmaya yönelik projelere (hem sistem performansı hem de daha hızlı geliştirme / daha az hata) bile işlevselliği artıran projelerin altında öncelik verilmektedir. Teknik insanlar bizim için sinir bozucu olsa da, yeniden düzenleme projelerinin uzun vadeli faydalarının ne olduğunu anlıyoruz, ancak daha az teknik olan iş adamlarının yeni işlevsellik ile yeni arasındaki doğrudan ilişkiyi görmenin daha kolay bir zamanı var. gelir. Bunun kaynaması şudur: "bunu daha sonra düzeltmek için geri geleceğiz" == "

Bunu göz önünde bulundurarak, verilerin boyutu, değişikliklerin çok sorgulanabileceği kadar küçükse ve / veya sadece değişiklikleri yapmak için değil, aynı zamanda bir şey giderse geri almak için yeterince uzun bir bakım pencereniz varsa yanlış, daha sonra Etemel sınıf tablosu ile A& Balt sınıf tabloları arasında bir aracı Tabloya normalleştirme işlemi işe yarayabilir (ancak yine de sizi belirli tür hakkında doğrudan bir bilgi olmadan bırakır ( AveyaB) temel sınıf tablosunda). AMA, bu tablolarda yüz milyonlarca satır ve tablolara referans veren inanılmaz miktarda kod varsa (değişiklikler yapıldığında test edilmesi gereken kod), genellikle idealist olmaktan daha pragmatik olmak için ödeme yapar. Ve bu yıllarca uğraşmak zorunda olduğum ortam: temel sunucuda 987 milyon satır ve 615 GB, 18 sunucuya yayıldı. Ve bu kadar çok kod bu tablolara çarptı (taban sınıfı ve alt sınıf tabloları) - çoğunlukla yönetimden ama bazen ekibin geri kalanından - gelişim miktarı ve Tahsis edilmesi gereken KG kaynakları.

Yani, bir kez daha, "en iyi" yaklaşım yalnızca duruma göre belirlenebilir: sisteminizi (yani, tabloların ve kodların ne kadar ilişkili olduğu), yeniden düzenlemenin nasıl gerçekleştirileceğini ve insanları bilmeniz gerekir (ekibiniz ve muhtemelen yönetiminiz - böyle bir proje için katılımlarını elde edebilir misiniz?). 1 - 2 yıldır bahsettiğim ve planladığım bazı değişiklikler var ve bunların% 85'ini uygulamak için birden fazla sprint / bülten aldım. Ancak, yalnızca <1 milyon satırınız varsa ve bu tablolara bağlı çok fazla kodunuz yoksa, muhtemelen şeylerin daha ideal / "saf" tarafında başlayabilirsiniz.

Unutmayın, hangi yolu seçerseniz seçin, bu modelin önümüzdeki 2 yıl içinde nasıl çalıştığına dikkat edin (mümkünse). O zamanın en büyük fikri gibi görünse bile, neyin işe yaradığına ve neyin acı çektiğine dikkat edin (yani, vidalamayı kabul etmenize izin vermeniz gerekir - hepimiz yaparız), böylece ağrı noktalarını dürüstçe değerlendirebilirsiniz ). Ve bir dahaki sefere "daha iyi" olma olasılığı daha yüksek olan kararlar alabilmeniz için bazı kararların neden işe yarayıp yaramadığına dikkat edin :-).


17

Martin Fowler'e göre, masa mirası sorununa 3 yaklaşım var:

  • Tek Tablo Kalıtım : Bir tablo tüm türleri temsil eder. Kullanılmayan özellikler NULL.
  • Beton Tablo Kalıtım : Her beton türü için bir tablo, türün her özelliği için her tablo sütunu. Tablolar arasında ilişki yok.
  • Sınıf Tablosu Devralma : Tür başına bir tablo, her tablonun yalnızca yeni, devralınmamış nitelikler için nitelikleri vardır. Tablolar, gerçek tür kalıtım hiyerarşisini yansıtan ilişkilidir.

Bunlarla her yaklaşımın artılarını ve eksilerini aramak için bir başlangıç ​​noktası olarak başlayabilirsiniz. Bunun özü, tüm yaklaşımların büyük dezavantajlara sahip olmasıdır ve hiçbirinin ezici bir avantajı yoktur. Daha iyi nesne ilişkisel empedans uyumsuzluğu olarak bilinen bu sorun henüz bir çözüm bulamamıştır.

Şahsen ben kötü ilişkisel tasarımın yol açabileceği sorunların tipinin kötü tip tasarımdan kaynaklanan sorunlardan daha ciddi olduğunu düşünüyorum . Kötü veritabanı tasarımı yavaş sorgulara, güncelleme anormalliklerine, veri boyutu patlamasına, kilitlenmelere ve yanıt vermeyen uygulamalara yol açar ve yüzlerce Gigabayt veri yanlış biçimde batırılır . Kötü tip tasarım, kodun bakımını ve güncellemesini zorlaştırır , çalışma zamanını değil. Bu nedenle, kitabımda, doğru ilişkisel tasarım , herhangi bir OO tipi saflığı tekrar tekrar koyar.


Bu soru olduğunu düşünüyorum @AlwaysLearningNewStuff bir takip dba.stackexchange.com/questions/139092 doğru? Uygulamasında orada yapmak tablo devralma var.
Remus Rusanu

Evet, bu soruyu sormadan önce önce tip / alt tip tasarımının nasıl uygulanacağını doğru anladığımdan emin olmak istedim. Şimdi bazı (ama hepsi değil!) Alt sınıfların öznitelikleri paylaştığında yukarıda açıklanan sorunla karşılaşıyorum . Bu nüansı göz ardı etmek yerine, veri modelini optimize etmek için yapabileceğim bir şey olup olmadığını merak ediyordum ...
AlwaysLearningNewStuff

6

Spesifikasyonlarınız hakkındaki yorumuma göre, iki farklı (ancak bağlantılı ) süper tip-alt tip yapıyı uygulamak için bir yöntem bulmak istiyorsunuz .

Yukarıda bahsi geçen göreve ulaşmak için bir yaklaşım ortaya koymak için, söz konusu senaryoya, adı verilen ve aşağıda ayrıntıları vereceğim iki klasik varsayımsal varlık türü ekleyeceğim.FooBar

İş kuralları

Mantıksal bir model oluşturmama yardımcı olacak birkaç ifade:

  • A Foo is either one Bar or one C
  • A Foo is categorized by one FooType
  • A Bar is either one A or one C
  • A Bar is classified by one BarType

Mantıksal model

Ve sonra, elde edilen IDEF1X [1] mantıksal modeli Şekil 1'de gösterilmektedir (ve bunu Dropbox'tan PDF olarak da indirebilirsiniz ):

Şekil 1 - Varsayımsal Üst Tip-Alt Tip İlişkileri Veri Modeli

Foo ve Bar ilavesi

Modeli eklemedim Foove Barmodeli daha iyi görünmesini sağladım, ancak daha etkileyici hale getirdim . Aşağıdakiler nedeniyle önemli olduklarını düşünüyorum:

  • As Ave Badlandırılmış özelliği paylaşan E, bu özellik göstermektedir onlar subentity türleri olduğu ayrı (ancak ilgili) tür kavramının , olay , kişi , ölçüm ben vasıtasıyla temsil, vb Barsuperentity tip sırayla,, yani özniteliği hiyerarşinin üstünde Footutan bir alt öğe türü D.

  • Yana Ctartışılmakta olan varlık tiplerinin, geri kalanı ile tek hisse fazla özellikte yani D, bu yönü ima bunun başka türlü bir subentity türü olduğunu konsepti , olay , kişi , ölçüm , vb sayesinde bu durumu tasvir Öyle Foosüper varlık türü.

Bununla birlikte, bunlar sadece varsayımlardır ve ilişkisel bir veritabanı belirli bir iş bağlamının anlambilimini doğru bir şekilde yansıtması gerektiği için , belirli bir alanınızdaki tüm ilgi alanlarını tanımlamanız ve sınıflandırmanız gerekir, böylece tam olarak daha fazla anlam yakalayabilirsiniz .

Tasarım aşamasında önemli faktörler

Tüm terminolojiyi bir kenara bırakarak, özel bir süper tip-alt tip kümenin sıradan bir ilişki olduğunun farkında olmak oldukça yararlıdır. Durumu şu şekilde tanımlayalım:

  • Her bir ayrıcalıklı üstünlük tipi oluşumu yalnızca bir alt öğe türü tamamlayıcısı ile ilgilidir.

Bu nedenle, bu durumlarda bire bir (1: 1) bir uyum (veya kardinalite) vardır.

Önceki yazılarınızdan bildiğiniz gibi, ayırıcı özelliği (uygulandığında sütun), bu türden bir ilişkilendirme oluştururken çok önemli bir rol oynar , çünkü üst türün bağlandığı doğru alt tür örneğini gösterir . Göç , (i) süper tip birincil anahtar (ii) alt tipleri de belirgin bir etkiye sahip olduğu için.

Beton DDL yapısı

Ve sonra yukarıda sunulan mantıksal modele dayanan bir DDL yapısı yazdım:

CREATE TABLE FooType -- Look-up table.
(
    FooTypeCode     CHAR(2)  NOT NULL,
    Description     CHAR(90) NOT NULL, 
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_FooType             PRIMARY KEY (FooTypeCode),
    CONSTRAINT AK_FooType_Description UNIQUE      (Description)
);

CREATE TABLE Foo -- Supertype
(
    FooId           INT      NOT NULL, -- This PK migrates (1) to ‘Bar’ as ‘BarId’, (2) to ‘A’ as ‘AId’, (3) to ‘B’ as ‘BId’, and (4) to ‘C’ as ‘CId’.
    FooTypeCode     CHAR(2)  NOT NULL, -- Discriminator column.
    D               INT      NOT NULL, -- Column that applies to ‘Bar’ (and therefore to ‘A’ and ‘B’) and ‘C’.
    CreatedDateTime DATETIME NOT NULL,
    CONSTRAINT PK_Foo                 PRIMARY KEY (FooId),
    CONSTRAINT FK_from_Foo_to_FooType FOREIGN KEY (FooTypeCode)
        REFERENCES FooType (FooTypeCode)
);

CREATE TABLE BarType -- Look-up table.
(
    BarTypeCode CHAR(1)  NOT NULL,  
    Description CHAR(90) NOT NULL,  
    CONSTRAINT PK_BarType             PRIMARY KEY (BarTypeCode),
    CONSTRAINT AK_BarType_Description UNIQUE      (Description)
);

CREATE TABLE Bar -- Subtype of ‘Foo’.
(
    BarId       INT     NOT NULL, -- PK and FK.
    BarTypeCode CHAR(1) NOT NULL, -- Discriminator column. 
    E           INT     NOT NULL, -- Column that applies to ‘A’ and ‘B’.
    CONSTRAINT PK_Bar             PRIMARY KEY (BarId),
    CONSTRAINT FK_from_Bar_to_Foo FOREIGN KEY (BarId)
        REFERENCES Foo (FooId),
    CONSTRAINT FK_from_Bar_to_BarType FOREIGN KEY (BarTypeCode)
        REFERENCES BarType (BarTypeCode)    
);

CREATE TABLE A -- Subtype of ‘Bar’.
(
    AId INT NOT NULL, -- PK and FK.
    X   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_A             PRIMARY KEY (AId),
    CONSTRAINT FK_from_A_to_Bar FOREIGN KEY (AId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE B -- (1) Subtype of ‘Bar’ and (2) supertype of ‘A’ and ‘B’.
(
    BId INT NOT NULL, -- PK and FK.
    Y   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_B             PRIMARY KEY (BId),
    CONSTRAINT FK_from_B_to_Bar FOREIGN KEY (BId)
        REFERENCES Bar (BarId)  
);

CREATE TABLE C -- Subtype of ‘Foo’.
(
    CId INT NOT NULL, -- PK and FK.
    Z   INT NOT NULL, -- Particular column.  
    CONSTRAINT PK_C             PRIMARY KEY (CId),
    CONSTRAINT FK_from_C_to_Foo FOREIGN KEY (FooId)
        REFERENCES Foo (FooId)  
);

Bu yapı ile veri tablolarınıza belirsizlik getirecek NULL işaretlerinin temel tablolarınızda (veya ilişkilerinizde ) saklanmasını önlersiniz .

Dürüstlük, tutarlılık ve diğer hususlar

Veritabanınızı uyguladıktan sonra, (a) her bir özel süper tip satırın her zaman karşılık gelen alt tip karşılığı ile tamamlandığından ve (b) bu ​​tür alt satırın üst tür ayırıcı sütununda bulunan değerle uyumlu olduğundan emin olmalısınız. . Bu nedenle, TRANSACTIONSveritabanınızda bu koşulların sağlandığından emin olmak için ACID kullanmak oldukça uygundur .

Veritabanınızın mantıksal sağlamlığını, kendini ifade etmeyi ve doğruluğunu bırakmamalısınız, bunlar kesinlikle veritabanınızı daha sağlam hale getiren unsurlardır.

Önceden gönderilen iki cevap zaten veritabanınızı ve uygulama programlarını tasarlarken, oluştururken ve yönetirken kesinlikle dikkate değer olan ilgili noktaları içerir.

VIEW tanımları yoluyla veri alma

Farklı supertype-subtype gruplarının sütunlarını birleştiren bazı görünümler oluşturabilir , böylece verileri her seferinde gerekli JOIN yan tümcelerini yazmadan elde edebilirsiniz. Bu şekilde, ilgilenilen GÖRÜNÜMDEN ( türetilmiş bir ilişki veya tablo ) doğrudan SEÇ seçebilirsiniz .

Gördüğünüz gibi, “Ted” Codd şüphesiz bir dahiydi. Sahip olduğu araçlar oldukça güçlü ve zariftir ve elbette birbirleriyle iyi entegre edilmiştir.

Alakalı kaynaklar

Süper tip-alt tip ilişkileri içeren bazı kapsamlı veritabanını analiz etmek isterseniz, @PerformanceDBA tarafından önerilen aşağıdaki Yığın Taşma sorularına verilen olağanüstü yanıtlara değer bulabilirsiniz :


Not

1. Bilgi Modellemesi için Entegrasyon Tanımı ( IDEF1X ), Aralık 1993'te Amerika Birleşik Devletleri Ulusal Standartlar ve Teknoloji Enstitüsü ( NIST ) tarafından standart olarak kurulan oldukça tavsiye edilen bir veri modelleme tekniğidir . Kesin olarak aşağıdakilere dayanmaktadır: (a) Dr. EF Codd tarafından yazılan erken teorik materyal; üzerinde (b) Varlık-İlişki tarafından geliştirilen veriler, görüş Dr. PP Chen ; ve ayrıca (c) Robert G. Brown tarafından oluşturulan Mantıksal Veritabanı Tasarım Tekniği. IDEF1X'in birinci dereceden mantık yoluyla resmileştirildiğini belirtmek gerekir.


İşverenlerim iş mantığını değiştirdi, Etamamen kaldı! Kullanıcı srutzky'nin cevabını kabul etmenin nedeni , en verimli rotayı seçme kararımı vermeme yardımcı olacak iyi noktalar sağlamasıdır. Aksi takdirde cevabınızı kabul ediyorum. Cevabınızı daha önce iptal ettim. Tekrar teşekkürler!
AlwaysLearningNewStuff
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.