Veritabanındaki özel yay nedir ve neden kötüdür?


10

Stackoverflow geliştirici soru-cevap tarafından yapılan en yaygın veritabanı tasarım hataları okuyordum . İlk cevapta münhasır yay hakkında ifade vardı:

Özel ark, bir tablonun iki veya daha fazla yabancı anahtarla oluşturulduğu yaygın bir hatadır ve bunlardan sadece bir tanesi boş olamaz. Büyük hata. Birincisi, veri bütünlüğünü korumak çok daha zorlaşıyor. Sonuçta, referans bütünlüğünde bile, bu yabancı anahtarların iki veya daha fazlasının ayarlanmasını engelleyecek hiçbir şey yoktur (buna rağmen karmaşık kontrol kısıtlamaları).

Özel arkın neden kötü olduğunu gerçekten anlamıyorum. Muhtemelen bunun temellerini anlamadım. Özel yaylarla ilgili iyi bir açıklama var mı?

Yanıtlar:


8

Uzun zaman önce anladığım kadarıyla, özel bir yayda bir tablo diğer tabloların yabancı anahtarları olan bir dizi sütun içeriyor, ancak bunlardan sadece bir tanesi (alandaki bazı mantıksal kısıtlama nedeniyle) gerçek dünyadan takip). Bu kural veritabanında uygulanamayacağı için, bu yabancı anahtarların birden fazlasının bir değerinin olduğu bozuk bir kayıt oluşturulabilir.

Bir örnek vereceğim. Bir şirketin mal teslim etmek için kullandığı kamyonları takip ettiği bir uygulamayı düşünün. Bir kamyon aynı anda sadece üç yerden birinde olabilir: bir çalışanla birlikte olabilir, bir garajda olabilir veya bir bakım mağazasında olabilir. Bu, Çalışan, ParkingGarage ve MaintenanceShop tablolarına atıfta bulunarak, çalışan kimliği, parkingGarageId ve maintenanceShopId içeren bir Kamyon masası ile modellenebilir. Veritabanı düzeyinde bu alanlardan yalnızca birinin doldurulması kuralını zorlamanın bir yolu yoktur. Bozuk kod veya veritabanına doğrudan erişimi olan biri, veritabanındaki veri bozulmasına karşılık gelen iki veya üç alan dolu bir kayıt ekleyebilir.


4
Olası üç kamyon konumu, bir üst sınıf "kamyon konumu" nun alt sınıflarıdır. Alt sınıfların birbirini dışlayan birçok durum vardır. Zorluk ilişkisel tablolarda sınıfların ve alt sınıfların nasıl modelleneceği haline gelir.
Walter Mitty

Bu tasarımın kullanılmasının haklı olduğu durumlar olduğunu kabul ediyorum. Bununla birlikte, bu desenin olması gerekenden çok daha fazla kullanıldığı orijinal gönderiye de katılabilirim. Çok büyük dezavantajları da var ...
JDT

6
Bir kontrol kısıtlaması kullanılamaz mı? Örneğin alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null)). Özel yayları sevmiyorum ama bir kontrol kısıtlaması ile uygulanabilir. Tabii ki FK kısıtı da mevcut olmalıdır.
Tulains Córdova

1
Bu nedenle, yukarıda belirtilen yazının "karmaşık kontrol kısıtlamalarına rağmen". Kontrol kısıtlamaları veya heck, hatta tetikleyicilerle gerçekten sofistike bir doğrulama yapabilirsiniz, bu da onu iyi bir fikir veya iyi bir tasarım belirteci yapmaz. Dört veya beş sütunlu özel yaylarda kontrol kısıtlamaları yaptığınızı düşünün ... Ayrıca, tüm veritabanı motorlarının CHECK kısıtlamasını desteklemediğinden oldukça eminim . MySQL, dock'ta CHECK cümlelerinin ayrıştırıldığını, ancak yoksayıldığını belirtir ...
JDT

Bu kaynak özel ark önerir. Düşünceler?
Alex Moore-Niemi

4

Özel yaylar hakkında kötü bir şey yoktur. Bir kontrol kısıtlaması kullanarak ilgili iş kuralını uygulamanız yeterlidir. Çoğu büyük veritabanı yönetim sistemi kontrol kısıtlamalarını destekler (Oracle, SQL Server, PostgreSQL). Bir veri modelleme aracı kullanıyorsanız, aracınızın kontrol kısıtlamasını uygulamak için otomatik olarak kod üretme olasılığı yüksektir.


-1

Özel ark Kavramsal veya Mantıksal tasarımda çok yararlıdır. Bu, bu şekilde uygulamanız gerektiği anlamına gelmez. Önceki örnekte tasarımcı, tasarımı üç tablo ile uygulamaya karar verebilir. Biri park yeri, diğeri çalışan ve diğeri bakım mağazası için.

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.