İşte basit bir örnek:Veritabanı tablosunda bir müşterinin varsayılan gönderim adresini nasıl belirlerim?
Adres tablosuna birebir çok ilişkisi olan bir müşteri çizelgesine sahip olduğumu varsayalım (bir müşterinin birden çok gönderi adresi olabilir, ancak bir gönderim adresi yalnızca tek bir müşteriye ait olabilir)).
Customer Table
-------------
customer_id (PK)
Address Table
-------------
address_id (PK)
customer_id (FK)
Artık her müşterinin varsayılan gönderim adresi belirleyebilmesini istiyorum.
2 yolu düşünebilirim fakat her ikisinin de dezavantajları vardır.
Seçenek 1
"is_default" denilen adres tablosunu bir Boole sütun ekleyin.
Artıları
- seç sorgularının
Eksileri
- uygulamadır DB modeli görürseniz diğer insanlar için Kolay
- anlamak için basit olan fo zorlamak ve sürdürmek için "tek sıra bir varsayılan olabilir" kısıtlaması.
- Varsayılan alanın güncellenmesi, uygulamanın önceki varsayılan seçeneği işaretleyip sıfırlamasını gerektirdiğinden bir acıdır. 2
Opsiyon "address_id" denilen Müşteri tabloya bir sütun ekleyin ve bir yabancı anahtar yapmak (ayrıca boş değerlere hiçbir adres Varlığından sadece durumda izin). kullanıcı bunu değiştirmeye karar verirse
Artıları
- Kolay varsayılan adresi güncellemek için.
- Veritabanı "yalnızca bir satır varsayılan olabilir" kısıtlamasını korur.
Eksileri
Ben Müşteriler Tablo I varsayılan meta çeşit eklemeye karar her zaman yeni endeksli sütun eklemek gerekir.
- Belkide benim senaryo bu tür işlemek için standart bir yol yoktur,
Sorum şu kesmek gibi görünüyor? Tabii ki başka seçenekler de var (belki bir EAV varsayılan seçenek tablosu oluşturuyorsunuz?). Ancak, değişiklik olabildiğince basit tutmayı tercih ediyorum, çünkü herhangi bir şeyi kırmak istemiyorum.
Bu aklıma ama sonra varsayılan bir deyişle kredi kartı –
@BillH hesapları gerektiren her tablo için yeni "varsayılan tablo" oluşturmak zorundayız: Neden? Credit_Card tablosuna işaret eden başka bir sütun olan "default_credit_card_id" eklemenizi engelleyen hiçbir şey yok. Tablonun adı, müşteri için * tüm * varsayılanları yakalamak için yeterince geneldir. – Mac