2016-03-30 15 views
1

Kullanıcıların veya kötü kodların geçersiz veri eklemesini durdurmak bana mantıklı geliyor, ancak bunu hiçbir yerde görmeyi hatırlamıyorum! karmaşık mysql kısıtlamaları

Eminim bir sipariş hep aynı kullanıcı tarafından oluşturulan bir adres başvurduğunu yapabilirsiniz nasıl Aşağıdaki tablolar enter image description here

  • düşünün

    ?
  • Bu tür bir kısıtlama normaldir ve önerilir mi? Demek istediğim, tasarımda bile buna bakmak zorunda mıyım?
+1

Bir kullanıcı birden fazla adres ekleyebilir? –

+0

@Sougata, yup, sadece bir exmaple! ama işyerinize veya evinize sipariş verebileceğinizi düşünelim. – azerafati

+0

Karmaşık 'iş mantığı', kullanıcı ve veritabanı arasındaki kod katmanında kodlanmalıdır. –

cevap

1

Bir kullanıcının geçerli bir adres olmadan bir sipariş verebilmesini beklememden dolayı, ayrı FK'yi kullanıcı tablosuna kaldırmayı ve birleştirilmiş kullanıcı id - adresi kimliği alanlarını yabancı anahtar olarak adres tablosu.

CREATE TABLE orders AS (
    --[COLUMN DEFINITIONS] 
    address_id BIGINT NOT NULL, 
    user_id BIGINT NOT NULL, 
    CONSTRAINT fk_usr_addr FOREIGN KEY (user_id, address_id) 
         REFERENCES address(user_id, id) 
) ENGINE=InnoDB; 

bir emir eksik ve henüz bir adres yoksa, o zaman bu using foreign keys mysql belgelerine göre beri, bir çok sütun yabancı anahtar için bir sorun olmamalı:

MAÇ SQL standardında fıkra, bir bir birincil anahtarla karşılaştırıldığında, bir kompozit (çok sütunlu) yabancı anahtardaki NULL değerlerinin nasıl ele alınacağını denetler. MySQL, yabancı anahtarın tamamen veya kısmen NULL olmasına izin veren MATCH BASİT tarafından tanımlanan semantikleri esas olarak uygular. Bu durumda, yabancı bir anahtar içeren (alt tablo) satırı, eklenmesine izin verilir ve başvurulan (ana) tablosundaki herhangi bir satırla eşleşmiyor. tetikleyicileri kullanarak diğer semantikleri uygulamak mümkündür.

+0

güzel öneri! Teşekkürler, ama henüz bir adresin ayarlanmadığı durumlarda eksik siparişlerim var ve bir kullanıcı adreslerinden birini istediği zaman kaldırmaya karar verirse ne olur? – azerafati

+0

Tamamlandığında bir sipariş değiştirilmemelidir. Dolayısıyla, kullanıcı halihazırda tamamlanmış bir siparişte bulunan bir adresi değiştirmek veya silmek istiyorsa, yeni bir adres kaydı oluşturmalı veya adresi adres defterinde silinmiş olarak işaretlemeli, ancak adresi gerçekten silmemelisiniz. Diğer çözüm ise adresi yabancı anahtar olarak kullanmak değil, içeriğini içeriğe kopyalamaktır. Bu durumda, adres tablosuna yabancı bir anahtar bile sahip olmayacaktır. Veri bütünlüğünü zorlamak için bu senaryo için tetikleyicileri kullanabilirsiniz. – Shadow

+0

anladım, teşekkürler. – azerafati