2010-12-11 39 views
8

Tôi có thư viện ảnh. Tôi muốn thêm nút "Thêm vào mục yêu thích" - để người dùng có thể thêm người dùng khác vào mục yêu thích của họ. Và sau đó tôi muốn mỗi người dùng có thể xem danh sách người dùng yêu thích của mình, cũng như để có thể xem ai (danh sách người dùng) đã thêm người dùng này vào mục yêu thích.cách tốt nhất để lưu trữ "mục yêu thích" của người dùng trong MySQL

tôi tìm thấy hai cách khác nhau, và là người đầu tiên là:

faver_id faved_id 
1  10 
1  31 
1  24 
10  1 
10  24 

Tôi không thích phương pháp này vì 1) một lô lặp lại 2) bảng rất lớn trong tương lai (nếu có ít nhất 1.001 người dùng và mỗi người thích 1.000 người dùng khác = 1 001 000 bản ghi) mà tôi cho là sẽ làm chậm cơ sở của tôi.

Cách thứ hai là:

user_id favs 
1   1 23 34 56 87 23 
10   45 32 67 54 34 88 101 

tôi có thể đưa những favs và phát nổ() chúng trong php hoặc tìm kiếm nếu người dùng thích một số người dùng khác bằng cách MySQL truy vấn select count(user_id) from users where favs LIKE '% 23 %' and user_id=10;

Nhưng tôi cảm thấy cách thứ hai không phải là rất "đúng" trong các điều khoản của MySQL.

Bạn có thể tư vấn cho tôi điều gì đó không?

Trả lời

13

Hãy nghĩ về điều này. Lập luận của bạn chống lại bằng cách sử dụng phương pháp đầu tiên là bảng của bạn có thể quá lớn, nhưng sau đó bạn tiếp tục nói rằng nếu bạn sử dụng phương pháp thứ hai, bạn có thể chạy truy vấn ký tự đại diện để tìm các trường có chứa.

Cách tiếp cận thứ hai buộc tìm kiếm toàn bộ bảng và không thể lập chỉ mục. Với cách tiếp cận đầu tiên, bạn chỉ cần tát chỉ mục trên mỗi cột của bạn và bạn tốt để đi. Cách tiếp cận đầu tiên có quy mô lớn, nhiều, nhiều hơn tốt hơn loại thứ hai. Kể từ khi mở rộng quy mô có vẻ là mối quan tâm duy nhất của bạn với đầu tiên, tôi nghĩ rằng câu trả lời là hiển nhiên.

Đi với phương pháp đầu tiên. Các bảng nhiều người được sử dụng ở mọi nơi và vì lý do chính đáng.

Chỉnh sửa:

Một phương pháp khác là bàn giao rất nhiều công việc trong việc duy trì cơ sở dữ liệu cho ứng dụng. Điều này là tốt trong một số trường hợp, nhưng các trường hợp bạn đang nói đến là những thứ mà cơ sở dữ liệu trội tại. Bạn sẽ chỉ tái phát minh ra bánh xe, và nặng.

+0

Rất cám ơn vì lời giải thích rõ ràng như vậy. Có, tôi quên rằng tôi có thể thêm chỉ mục bảng trong trường hợp đầu tiên và nó sẽ giải quyết vấn đề với hàng ngàn hồ sơ. – oyatek

+0

@oyatek: Không sao cả. Tôi rất vui được giúp đỡ. – AgentConundrum

1

Vâng, cách thứ hai không dễ dàng gì khi bạn muốn xóa hoặc thực hiện thay đổi, nhưng nó hoàn toàn phù hợp về mặt MySQL. Mặc dù, Joomla thậm chí còn bao gồm ngày thông tin khác nhau trong cùng một lĩnh vực được gọi là params.

1

Chắc chắn đi theo cách đầu tiên.

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