Birincil anahtar _id olan Kullanıcılar için bir MySQL tablom var ve arkadaşlıkları (diğer kullanıcıların arkadaş listelerinde görünebilirliğini) temsil etmek istiyorum. userId yabancı anahtar çiftleri içeren tablo. Bu hem (userIdA = 2, userIdB = 7)
ve (userIdA = 7, userIdB = 2)
ayrı satır olarak eklenecek sağlayacak benim anlayışSipariş vermeden SQL birleşik birincil anahtar (her iki sırada da tamsayı çifti benzersiz olmalıdır)
CREATE TABLE UserFriendships (
userIdA INT NOT NULL,
userIdB INT NOT NULL,
PRIMARY KEY (userIdA, userIdB),
FOREIGN KEY (userIdA) REFERENCES Users(_id)
FOREIGN KEY (userIdB) REFERENCES Users(_id)
)
: Ben böyle bir şey düşünüyorum. Arkadaşlık başına bir satır istiyorum, yani bir çift userIds için bir satır.
Bunu nasıl geliştirebileceğimi bilen var mı? Yukarıdaki kısıtlama yerine getirilmiş olsa bile, kullanıcının tüm arkadaşlarının bir listesini almak için bir birlik yapmak zorundayım, bir şey gibi: SELECT userIdB AS friendUserId WHERE userIdA = foo UNION SELECT userIdA WHERE userIdB = foo
. Bu sorguyu gerçekleştirmenin en iyi yolu mu, yoksa şemamı değiştirmeyi düşünmeli miyim? (
userIdA
alt kimliği ile her zaman kullanıcı ve daha yüksek kimliği
Bu şekilde her iki kombinasyon ile userIdB
daima kullanıcı:
Karşılıklılıkla nasıl başa çıkıyorsunuz? – Strawberry
Başka bir DBMS ile oldukça kolay olurdu, ancak MySQL ile bunu önlemek için yalnızca bir tetikleyici çözüm bulabilirim. –
@Strawberry Bunu düşünmemiştim, ancak bir kez karşılık verdikten sonra Kullanıcı İşbirlikleri'ne eklenmiş olan bir FriendRequests tablosu ekleyebilirim. Aynı verileri içerecek olsalar da, bu gereksiz gibi görünmüyor ... –