2011-07-11 37 views
13

Tôi đang cố gắng xác định thiết kế bảng tốt nhất cho tính năng "theo dõi/hủy theo dõi", tương tự như Twitter (chỉnh sửa: Tôi không tạo ứng dụng giống như Twitter). Dưới đây là thiết kế bảng hiện tại của tôi và xử lý php. Tôi không chắc chắn nếu đó là cách tiếp cận tốt nhất và thực sự sẽ đánh giá cao phản hồi của bạn.Thiết kế bảng cơ sở dữ liệu "Theo dõi người dùng"

CREATE TABLE IF NOT EXISTS `user_follow` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `follower` int(11) NOT NULL, 
    `following` int(11) NOT NULL, 
    `subscribed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `follow_unique` (`follower`,`following`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; 

On sau, những người theo id sẽ được thêm vào follower lĩnh vực và id của người dùng sẽ được theo sau sẽ được thêm vào following. Tôi cũng đang ghi ngày mà người dùng đã đăng ký theo dõi một người dùng khác trong trường subscribed. Ngày đăng ký có thể được sử dụng để sắp xếp.

Khi người dùng không theo dõi, tôi chỉ cần xóa hàng tương ứng.

Để ngăn các hàng trùng lặp, tôi đã tạo các cột followerfollowing duy nhất. Nếu người dùng là đã sau một id và nhấp chuột để làm theo một lần nữa, tôi nhận được lỗi cơ sở dữ liệu 1062. Ví dụ

Duplicate entry '62 -88' cho khóa 'follow_unique'

Rõ ràng khi đã sau người dùng, người theo dõi sẽ thấy nút unfollow. Điều này đạt được bằng cách kiểm tra xem một hàng bảng sau có tồn tại giữa 2 người dùng hay không. Nếu rows > 0 tôi hiển thị unfollow nếu không follow.

Vâng, bạn nghĩ sao?

+3

Tôi không cố gắng tạo lại Twitter .. Nó cho mục đích hoàn toàn khác nhưng có chức năng giống như Twitter về đăng ký – CyberJunkie

+2

Nghe có vẻ hay nhưng tôi sẽ thêm (nếu bạn chưa có) trên 'follower' và' following' tới bảng Người dùng của bạn. – Dirk

+2

Điều bạn đang làm có vẻ ổn với tôi. Tôi sẽ đề nghị sử dụng 'ENGINE = InnoDB' hơn là' MyISAM' mặc dù, vì vậy bạn có thể thực thi các mối quan hệ 'NGOẠI TỆ 'và' ON DELETE/UPDATE'. Điều này có thể yêu cầu thay đổi động cơ cho nhiều bảng của bạn để có hiệu quả mặc dù. –

Trả lời

7

Tôi nghĩ rằng đó là một thiết kế rất tốt và phải đáp ứng nhu cầu của bạn một cách độc đáo. Một điều; bạn có thể làm cho các phím nước ngoài followerfollowing. Ồ, và vì mục đích đơn giản, tôi sẽ làm cho cột subscribedTIMESTAMP DEFAULT CURRENT_TIMESTAMP chỉ để nắm bắt thời gian mà người dùng đã đăng ký.

+0

Cảm ơn! Bằng các ràng buộc về Ngoại ngữ, bạn có nghĩa là các id duy nhất cho người theo dõi và theo sau phải không? Nếu đúng như vậy. – CyberJunkie

+4

@CyberJunkie bởi các ràng buộc khóa ngoài, chúng có nghĩa là chuyển các bảng của bạn sang công cụ bảng mysql thay thế, innodb, cho phép khóa ngoài. những ràng buộc này làm cho nó trở thành ví dụ nếu bạn xóa một bản ghi người dùng và có các bản ghi trong các bảng khác được kết nối bằng khóa ngoài, các bản ghi đó cũng sẽ bị xóa, do đó ngăn ngừa các bản ghi mồ côi. cũng hoạt động để cập nhật. có thể được thiết lập trong phpMyAdmin. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html – dqhendricks

+0

Cảm ơn bạn đã làm rõ! Tôi đã không nhận thức được tính năng này, tôi chắc chắn sẽ tìm hiểu thêm về nó! – CyberJunkie

3

Tôi khuyên bạn nên theo dõi và theo dõi khóa chính. Không cần có một trường riêng biệt id.

+0

Tôi đã được thông báo điều này trước đây nhưng vì một lý do nào đó có vẻ như "hacky" đối với tôi, tôi cũng không thể thực hiện cả hai chính. Tôi gặp lỗi hoặc không có gì xảy ra. Hơn nữa tôi muốn có một A.I.khóa chính duy nhất. Đó là tiêu chuẩn cơ sở dữ liệu. Tôi không có ý nói nghe có vẻ hoang mang, tôi không biết nhiều về cách tiếp cận này – CyberJunkie

Các vấn đề liên quan