2012-03-23 26 views
5

Tôi đang xây dựng biểu đồ xã hội cho trang web của mình. Người dùng sẽ tạo ra các mối quan hệ (của biểu mẫu đi theo/theo sau) trong đó mỗi bên có thể độc lập theo dõi nhau. bảng người dùng của tôi trông như thế này:SQL Modeling Follower/Các mối quan hệ tiếp theo Đối với mạng xã hội

Users table 
- UserId (PK, Auto-incrementing integer) 

tư duy như thế nào để mô hình này, tôi đã đi lên với một số lựa chọn thay thế, chẳng hạn như:

(a) Một bảng chứa mỗi hành động 'làm theo' như một hàng riêng biệt.

Relationships table 
- FollowerId (FK to Users.UserId) 
- FollowedId (FK to Users.UserId) 

Điều này có nhược điểm cho nhiều người dùng, nó sẽ tạo ra một số lượng lớn hàng.

(b) Một bảng chứa danh sách của người sử dụng mỗi người dùng được sau như một CSV hoặc cấu trúc khác: (? Và tốn kém)

Relationships table 
- FollowerId (FK to Users.UserId) 
- FollowingUsers (e.g. 2,488,28,40) 

này có nhược điểm là các truy vấn sẽ phức tạp hơn nhiều. Tôi cũng phải duy trì trật tự của các giá trị chuỗi, vv ...

(c) Một mối quan hệ cho mỗi hàng, nơi người dùng có thể vào một trong hai 'bên' của mối quan hệ:

Relationships table 
- Party1Id (FK to Users.UserId) 
- FollowingParty2 (boolean) 
- Party2Id (FK to Users.UserId) 
- FollowingParty1 (boolean) 

Điều này tiết kiệm hàng trên (a), nhưng các truy vấn phức tạp hơn vì người dùng có thể là một trong hai bên.

(d) Đặt cả 'theo dõi' và 'tiếp theo' như danh sách tương tự (b)

Relationships table 
- UserId (FK to Users.UserId) 
- FollowingUsers (e.g. 2,488,28,40) 
- FollowedBy (e.g. 2,488,28,40) 

Điều này có vẻ như tốt nhất của tất cả thế giới, nhưng bây giờ tôi phải sử dụng các giao dịch để cập nhật nhiều hàng .

Giả sử tôi đang tìm cách mở rộng quy mô lớn, mặc dù nhận thức được rằng "sự cố của Facebook không phải là vấn đề của tôi" - tùy chọn nào hoặc tùy chọn nào khác được ưu tiên?

Trả lời

5

Tôi muốn đi với tùy chọn A.

  1. Bất kỳ loại phân tích đồ thị xã hội sẽ không thể sử dụng tùy chọn khác
  2. Thi hành bất kỳ loại hạn chế quan hệ sẽ không thể sử dụng tùy chọn khác
  3. Không có cần sử dụng cơ sở dữ liệu quan hệ nếu bạn không có kế hoạch lưu trữ dữ liệu theo cách quan hệ.

Một lựa chọn thú vị có thể được xem xét mô hình mối quan hệ bảng:

mối quan hệ bảng

  • RelationshipId
  • UserId (FK để Users.UserId)
  • RelationType

Giờ đây, bạn có thể kết nối người dùng.

trường hợp B sau A:

  • thêm RelationshipId1, UserAId, "IsFollowed"
  • thêm RelationshipId1, UserBId, "IsFollowing"

trường hợp người dùng khác bắt đầu sau A:

  • thêm RelationshipId1, AnotherUserId, "IsFollowing"

trường hợp người dùng khác bắt đầu sau B:

  • thêm RelationshipId2, AnotherUserId, "IsFollowing"

Bạn thậm chí có thể loại bỏ hàng không cần thiết nếu bạn muốn: Một bắt đầu sau B:

  • thêm mối quan hệId3, UserAId, "IsFollowedAndIsFollowing"
  • thêm RelationshipId3, UserBId, "IsFollowedAndIsFollowing"
  • xóa RelationshipId1, UserBId, "IsFollowing"
Các vấn đề liên quan