2010-04-08 35 views
8

Tôi có các bài viết trên trang web của mình và tôi muốn thêm các thẻ mô tả từng bài viết, nhưng tôi gặp sự cố với bảng mysql thiết kế cho các thẻ. Tôi có hai ý tưởng:Làm thế nào để thiết kế một Bảng MySql cho một Đám mây Tag?

  1. mỗi bài viết sẽ có trường "thẻ", và các thẻ sẽ ở dạng: "TAG1, TAG2, TAG3"
  2. tạo bảng gọi là các thẻ khác với các lĩnh vực: TAG_NAME, article_ID

vì vậy, khi tôi muốn tags cho bài viết với ID 1, tôi sẽ chạy

SELECT ... FROM tags WHERE `article_id`=1; 

Nhưng, tôi cũng muốn biết 3 sản phẩm tương tự nhất bằng cách so sánh thẻ, vì vậy nếu tôi có bài viết trong đó có thẻ " php, của tôi sql, erlang "và 5 bài viết có thẻ:" php, mysql "," erlang, ruby ​​"," php erlang "," mysql, erlang, javascript ", tôi sẽ chọn 1., 3. và 4., vì những 3 có nhiều thẻ giống nhau nhất với bài viết chính.

Ngoài ra câu hỏi khác, cách tốt nhất để nhận được 10 "thẻ được sử dụng nhiều nhất" là gì?

Trả lời

18

Nói chung, cho các loại hình nhiều-nhiều mối quan hệ, có ba bảng:

  • Các "article" bảng
    • khóa chính = id
  • Các " tag "bảng
    • khóa chính = id
    • chứa dữ liệu của mỗi thẻ:
      • tên, ví dụ
  • A "tags_articles" bảng, hoạt động như một bảng tham gia, và chỉ chứa:
    • id_article: khóa nước ngoài trỏ đến một bài viết
    • id_tag: khóa ngoài trỏ đến thẻ


Bằng cách này, không có sự trùng lặp dữ liệu bất kỳ của thẻ: cho mỗi thẻ, có một và chỉ một, dòng trong bảng tag.

Và, đối với mỗi bài viết, bạn có thể có một số thẻ (ví dụ: một số dòng trong bảng tags_articles); và, tất nhiên, đối với mỗi thẻ, bạn có thể có một số bài viết.

Bắt một danh sách các thẻ cho một bài báo, với ý tưởng này, là một vấn đề của một truy vấn thêm vào một số, như:

select tag.* 
from tag 
    inner join tags_articles on tag.id = tags_articles.id_tag 
where tags_articles.id_article = 123 


Bắt ba "nhất tương tự như" bài viết có nghĩa là:

  • chọn các bài viết có thẻ mà bài viết đầu tiên có
  • chỉ sử dụng những bài có số lượng thẻ giống hệt nhau quan trọng nhất

Không thử nghiệm, nhưng một ý tưởng có thể là một cái gì đó sẽ trông như thế này:

select article.id, count(*) as nb_identical_tags 
from article 
    inner join tags_articles on tags_articles.id_article = article.id 
    inner join tag on tag.id = tags_articles.id_tag 
where tag.name in ('php', 'mysql', 'erlang') 
     and article.id <> 123 
group by article.id 
order by count(*) desc 
limit 3 

Về cơ bản, bạn:

  • chọn các bài viết id cho mỗi thẻ đó là mặt trên bài viết đầu tiên của bạn
    • vì có sự tham gia bên trong, nếu một bài viết trong DB có 2 thẻ khớp với mệnh đề where, không có group by cl sử dụng, sẽ có hai dòng cho bài viết đó
    • tất nhiên, bạn không muốn chọn lại bài viết bạn đã có - điều đó có nghĩa là nó phải được loại trừ.
  • nhưng, khi bạn sử dụng group by article.id, sẽ có một dòng duy nhất cho mỗi bài viết
    • nhưng bạn sẽ có thể sử dụng count, để tìm hiểu có bao nhiêu thẻ mỗi bài viết có điểm chung với ban đầu một
  • thì đó chỉ là vấn đề phân loại theo số lượng thẻ và chỉ nhận được ba dòng thứ ba.
+0

có, nhưng bạn đã không trả lời câu hỏi chính của tôi, cách nhận 3 bài viết tương tự nhất? – mfolnovich

+1

@mfolnovich: Tôi đã chỉnh sửa câu trả lời của mình một vài lần, để thêm thông tin thêm về thiết kế; và, sau đó, nhìn thấy bình luận của bạn, tôi chỉnh sửa lại, để thêm một ý tưởng có thể có của giải pháp để có được 3 bài viết tương tự nhất. –

1

Trước hết, bạn sẽ muốn sử dụng đề xuất của Pascal MARTIN về thiết kế bảng.

Đối với việc tìm kiếm các bài viết tương tự, dưới đây là một số thứ giúp bạn bắt đầu. Cho rằng @article_id là bài viết bạn muốn tìm các trận đấu cho, và @ TAG1, @ TAG2, @ TAG3 là các thẻ cho bài viết đó:

SELECT article_id, count(*) 
FROM tags_articles 
WHERE article_id <> @article_id 
AND tag_id IN (@tag1, @tag2, @tag3) 
GROUP BY article_id 
ORDER BY count(*) DESC 
LIMIT 3 
0

có, nhưng bạn không trả lời câu hỏi chính của tôi, làm thế nào để có được 3 bài viết tương tự nhất?

Trả lời: Chỉ cần tìm cùng một id thẻ trong bảng đã hợp nhất (thẻ_articles). Thu thập chúng và tạo ra một mô hình.

Ví dụ: Điều 1 có tags: 1,2 Điều 2 có tags: 2,3,4 Điều 5 có tags: 6,7,2 Điều 7 có tags: 7,1,2, 3

Nếu bạn muốn 3 bài viết tương tự nhất cho bài viết 1, bạn phải tìm các thẻ 1,2. Bạn sẽ thấy Điều 7 là giống nhất và 2 và 5 có một số điểm tương đồng.

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