Tôi có bảng MySQL cho Người dùng có khóa chính _id và tôi muốn đại diện cho tình bạn (hiển thị trên danh sách bạn bè của người dùng khác) dưới dạng bảng với cặp các khóa ngoài của người dùng. Tôi đang nghĩ đến một cái gì đó như:Khóa chính của SQL composite không có thứ tự (cặp số nguyên theo thứ tự phải là duy nhất)
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)
)
Đó là sự hiểu biết của tôi rằng điều này sẽ cho phép cả hai (userIdA = 2, userIdB = 7)
và (userIdA = 7, userIdB = 2)
được chèn như hàng riêng biệt. Tôi muốn một hàng cho mỗi tình bạn, đó là nói một hàng cho mỗi cặp userIds.
Có ai biết cách tôi có thể cải thiện điều này không? Ngay cả khi các ràng buộc trên được đáp ứng, để có được một danh sách của tất cả các bạn bè của người dùng foo tôi phải làm một công đoàn, một cái gì đó như: SELECT userIdB AS friendUserId WHERE userIdA = foo UNION SELECT userIdA WHERE userIdB = foo
. Đây có phải là cách tốt nhất để thực hiện truy vấn đó hay tôi nên suy nghĩ về việc thay đổi lược đồ của mình?
cách bạn đối phó với sự tương hỗ? – Strawberry
Sẽ khá dễ dàng với bất kỳ DBMS nào khác, nhưng với MySQL tôi chỉ có thể nghĩ ra một giải pháp kích hoạt để ngăn chặn điều này. –
@Strawberry Tôi đã không nghĩ về điều đó, nhưng tôi có thể bao gồm một bảng riêng biệt của FriendRequests mà, một lần đáp lại, kết quả là chèn vào UserFriendships. Mặc dù chúng sẽ chứa cùng một dữ liệu, do đó dường như không cần thiết ... –