2012-02-14 41 views
8

Điều này có thể là một vấn đề khiến tôi mất nhiều thời gian hơn để suy nghĩ cách làm đúng, suy nghĩ theo cách tối ưu nhất để làm.Cách tốt nhất để tạo ra một hệ thống "hashtag"

Tôi có bảng "Nội dung" và cần thêm tùy chọn để liên kết nhiều "thẻ bắt đầu bằng #" hoặc "thẻ" hoặc "từ khóa" cho nội dung, ví dụ: nội dung như "khoai tây chiên với sốt cà chua" có "keys": "potato", "ketchup" và "fried".

Và khi tôi thực hiện tìm kiếm theo một từ, ví dụ "khoai tây", tôi cần hiển thị nội dung có trong đó gắn thẻ từ này.

Câu hỏi đặt ra là cấu trúc tốt nhất của nó để làm điều này, suy nghĩ về tốc độ kết quả vì bảng nội dung là một MIS MyISAM hơn 30 hàng Millon.

Tôi nghĩ rằng trong việc này:

Hãy thêm 2 bảng, "contents_hashtags" (id(INT11), content_id(INT11), hashtag_id(INT11)) và "hashtags" (id(INT11), hashtag(VARCHAR(40))) 2 bảng trong InnoDB

Khi người dùng tạo/sửa đổi nội dung bảng, tôi tìm kiếm trong thẻ hashtags và nhận ID, nếu thẻ bắt đầu bằng # không tồn tại, hãy tạo thẻ đó trong thẻ bắt đầu bằng #, nếu có, hãy lấy ID, sử dụng ID này tạo các chèn trong bảng content_hashtas nội dung liên kết < -contents_hashtas-> hashtahs

Trong tìm kiếm, thực hiện JOINS (LEFT/RIGHT/INNER dude ..) và thực hiện tìm kiếm bằng LIKE ?? theo chính xác (hashtag = "XXX") hoặc TEXT TEXT FULL?

Phương pháp này có chính xác/nhanh không? Tôi không biết làm thế nào chạy này với một số lượng hàng lớn và lưu lượng lớn ..

Trả lời

2

Trên thực tế, một bảng phụ là đủ

"hashtags" (id (INT11), hashtag (VARCHAR (40))), CONTENT_ID (int11))

Bây giờ bạn có thể chỉ cần thêm tên của hastag theo tên. Để nhận tất cả thẻ bắt đầu bằng # cho nội dung, hãy sử dụng

SELECT hashtag FROM hashtable WHERE content_id=$content_id 

Để thêm thẻ bắt đầu bằng #, hãy xóa thẻ đó bằng id hoặc thẻ bắt đầu bằng #. Để có được nội dung cho hastags cụ thể, chỉ cần sử dụng

SELECT ct.* from hashtable ht, contenttable ct WHERE ht.hashtag=$hastag and ct.id=ht.content_id 

và vân vân

3

Ba bảng sẽ làm các trick:

Nội dung, hashtags, và ConTags. Thẻ conTags sẽ là bảng nối chứa content.id và hashtags.id. Bằng cách này, bạn có thể gán nhiều thẻ bắt đầu bằng # cho từng mục trong Nội dung.

SELECT * FROM Contents c, Hashtags h LEFT JOIN ConTags t ON c.Id = t.ConId AND h.Id = t.HashId 

Ngoài ra, thiết lập hashtags TêncontentId chìa khóa như là duy nhất và bảng ngã ba không còn cần thiết

+0

gì các phương pháp là để nhanh chóng tìm kiếm? phương pháp 3 bảng hoặc 2 bảng? Trong phương thức 3 bảng là một mối quan hệ trực tiếp bằng JOIN, nhưng trong phương thức 2 bảng, thẻ bắt đầu bằng # được "nhân đôi" cho nội dung (vì id + hashtag cant repeat). Nếu tôi thực hiện tìm kiếm ví dụ: content.active = 1 AND (contents.name = 'xxx' OR (Contags.hashtag = 'XXX' và Content.id = Contags.content_id)) – Zenth

+0

Được bỏ phiếu cho "Cách khác, đặt Hashtags Name và ContentId là khóa duy nhất". Không cần 3 bảng 2 là đủ. – DeepBlue

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