Yabancı anahtarları Yönetme

4 Cevap php

Yani birkaç tablo ile bir veritabanı var.

İlk tablo kullanıcı kimliği, ilk adını ve soyadını içerir.

İkinci tablo kullanıcı kimliği, faiz kimliği ve faiz derece içerir.

Ilgi kimlikleri bütün olan başka bir tablo var.

Her faiz kimliği için (yenileri ekleniyor bile), ben her kullanıcı (hatta boşsa, ya da varsayılan vardır) faiz kimliği için bir giriş olduğundan emin olmak gerekir.

Yabancı anahtarlar, bu senaryo ile yardımcı olacak? ya da ben yeni bir anahtarı eklediğinizde her kaydı güncellemek için PHP kullanmak gerekir?

4 Cevap

For every interest ID (even when new ones are added), I need to make sure that each user has an entry for that interest ID (even if its blank, or has defaults).

Eğer sorguları birinde yerine bir OUTER JOIN (ya LEFT veya RIGHT) gerekir gibi geliyor.

Eğer ilgi düzeyini almak istedim Örneğin, belirli bir kişi, her ilgi için vardır:

Assuming your tables look like this:
users:
user_id PK
user

user_interests:
user_id PK FK
interest_id PK FK
interest_level

interests:
interest_id PK
interest

SELECT i.interest, ui.interest_level
FROM interests i
INNER JOIN user_interests ui USING (interest_id)
LEFT JOIN users u USING (user_id)
WHERE user_id = ?

? bir yer tutucudur.

O ui.interest_level hiçbir veri ile çıkarları için boş olacaktır unutmayın.

Yabancı anahtarlar constraint bir tür, bu yüzden onlar sadece fail kayıtları eklemeye çalıştığınızda.

Eğer bir tetikleyici ile açıklayan ne başarabilirsiniz. Ben MySQL sözdizimi bilmiyorum, ancak SQL Server böyle bir şey olacaktır:

CREATE TRIGGER TR_ensure_user_interest ON interest FOR INSERT, UPDATE AS
BEGIN
    INSERT user_interest (user_id, interest_id)
    SELECT user_id, interest_id
      FROM inserted
          ,user
    EXCEPT (SELECT user_id, interest_id)
END

Bu oldukça verimsiz bir yaklaşımdır, ama bu konuda endişeleriniz vakaların çoğunda kapsaması gerektiğini unutmayın.

UPDATE: Burada tasarım "koku" gözlemledim diğerleri ile katılıyorum. Sorguları JOIN kullanarak istenilen sonucu başarmak durumunda, bu çok daha etkili bir çözüm olacaktır. Ancak, aslında sorulan soruyu cevaplamak için çalışıyordu. (Artı, ben fiziksel kayıtları bileşik sorguları usta değil, diğer veritabanı kullanıcıları için yararlı olan bu durum, olmuştur.)

Eğer çok sıkı mantıksal tasarım ayna fiziksel tasarım zorluyor gibi geliyor.

Belki de fiziksel tablodaki her kullanıcı için bir satır eklemek gerekir neden tam olarak yeniden düşünmek için iyi bir fikir olacaktır. Eğer sadece belirli bir kullanıcı için bir ilişkili interestID yoksa bir interestID için varsayılan değer varsaymak sorguları yazamadı?

"Yabancı anahtarlar, bu senaryo ile yardımcı olacak mı?"

Hayır.

Sizin kısıt "tamlık" kısıtlaması bir tür. Bu eklenen her yeni Yararına gibi birçok satır kullanıcı var gibi USER_INTEREST tabloya eklenen olması gerektiğini ima eder.

Hiçbir SQL sistem sizin için zorlamak mümkün değildir. Bu kod ile bunu uygulamak size kalmış.