Diğer bir yol (boşlar olmadan ve FOREIGN KEY
ilişkilerde döngü olmadan ) "favori çocukları" saklamak için üçüncü bir tabloya sahip olmaktır. Çoğu DBMS'de, ek bir UNIQUE
kısıtlamaya ihtiyacınız olacak TableB
.
@Aaron, yukarıdaki adlandırma kuralının oldukça hantal olduğunu ve hatalara yol açabileceğini tanımlamak için daha hızlıydı. Id
Tablonun her yerinde sütunlarınız yoksa ve (birleştirilmiş olanların) görünen birçok tabloda aynı adlara sahipseniz, genellikle daha iyidir (ve aklı başında tutar) . Yani, burada bir yeniden adlandırma:
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
UNIQUE (ParentID, ChildID)
FavoriteChild
ParentID INT NOT NULL PRIMARY KEY
ChildID INT NOT NULL
FOREIGN KEY (ParentID, ChildID)
REFERENCES Child (ParentID, ChildID)
SQL-Server'da (kullanmakta olduğunuz), IsFavorite
bahsettiğiniz bit sütun seçeneğine de sahipsiniz . Her ebeveyn için benzersiz favori çocuk, filtrelenmiş bir Benzersiz Dizin aracılığıyla gerçekleştirilebilir:
Parent
ParentID INT NOT NULL PRIMARY KEY
Child
ChildID INT NOT NULL PRIMARY KEY
ParentID INT NOT NULL FOREIGN KEY REFERENCES Parent (ParentID)
IsFavorite BIT NOT NULL
CREATE UNIQUE INDEX is_FavoriteChild
ON Child (ParentID)
WHERE IsFavorite = 1 ;
Seçenek 1'in tavsiye edilmemesinin ana nedeni, en azından SQL Server'da değil, yabancı anahtar referanslarındaki dairesel yolların deseninin bazı problemleri olmasıdır.
Oldukça eski bir makaleyi okuyun: SQL By Design: The Dairesel Referans
İki tablodan satır eklerken veya silerken, "tavuk ve yumurta" sorunuyla karşılaşırsınız. Hangi tabloyu önce eklemeliyim - herhangi bir kısıtlamayı ihlal etmeden?
Bunu çözmek için, boşuna alınabilecek en az bir sütun tanımlamanız gerekir. (Tamam, teknik olarak, tüm sütun olabilir gerekmez olarak NOT NULL
fakat sadece ertelenebilir kısıtlamaları uygulayan benzer bir soru Erwin'ın cevap @ görün Postgres ve Oracle gibi DBMS, içinde:. Sqlalchemy içinde Kompleks yabancı anahtar kısıtlaması nasıl Bu Postgres'te yapılabilir). Yine de, bu kurulum ince buzda kaymak gibi geliyor.
SO'da neredeyse aynı bir soruyu kontrol edin (ancak MySQL için) SQL'de, iki tablonun birbirine atıfta bulunması uygun mudur? Cevabım hemen hemen aynı. MySQL'in kısmi indeksleri yok, bu yüzden uygulanabilir tek seçenek nULL olabilecek FK ve ekstra masa çözümü.