2009-05-22 3 views
3

뉴스 사이트를 구축했습니다 : - 기사는 날짜순으로 정렬 된 첫 페이지에 표시됩니다. 가장 새로운 것부터. - 뉴스는 "id", "title", "text"및 일부 필드와 함께 "news"테이블에 있습니다. - 모든 기사는 1-5 개의 관련 태그로 태그가 지정됩니다. - 태그는 "id", "tag", "article"및 일부 필드가있는 "tags"테이블에 있습니다. - "tags"필드 "article"은 "news"필드 "id"에 맞습니다.최고의 DB (MySQL) 구조 : 선호 태그가 포함 된 기사

이제 사용자가 "선호하는 태그 목록"에 태그를 추가 할 수있는 기회를 제공하고 싶습니다. 그런 다음 사용자는 선호하는 태그 중 하나를 포함하는 뉴스 기사 만 볼 수 있습니다.

사용자 Bob이 "barack obama", "nba", "new jersey"및 "dogs"태그를 선호한다고 가정합니다. 그는이 네 가지 태그 중 적어도 하나를 포함하는 기사 만보아야합니다.

어떻게 이것을 달성 할 수있는 PHP/MySQL 스크립트를 코딩 할 수 있습니까? 제 데이터베이스 구조가이 목적에 적합하지 않다고 생각합니까? 나는 이런 식으로 DB 쿼리를 만들어야 할 것입니다 :

"SELECT * FROM 뉴스에서 어디에서 태그를 ('barack obama', 'nba', 'new jersey', 'dogs') "

이 쿼리는 오랜 시간 동안 실행됩니다. 그렇습니까? 광산보다 더 적절한 데이터베이스 구조가 있어야합니다. 이 문제에 대한 아이디어가 있습니까? 어떤 DB 구조가 필요하며 어떤 쿼리를 사용해야합니까?

도와 주시면 감사하겠습니다. 미리 감사드립니다!

답변

8

다음은 절대로 포괄적 인 것은 아니지만 올바른 방향으로 가야합니다.

테이블 :

news 
===== 
id 
title 
text 

tag 
=== 
id 
tag 

tag_map 
======= 
tag_id 
news_id 

favorite_tags 
============= 
user_id 
tag_id 

쿼리

SELECT * 
FROM favorite_tags 
JOIN tag_map ON favorite_tags.tag_id = tag_map.tag_id 
JOIN news ON tag_map.news_id = news.id 
WHERE favorite_tags.user_id = $userid 
+0

이 빠르고 좋은 답변을 주셔서 대단히 감사합니다. 마지막 질문 : 색인을 설정해야하는 필드는 무엇입니까? "news"에서 기본 ID로 "id"를 기본 태그로 "tag", "tag_id, news_id"를 기본 태그로 선택하고 "tag_map"에서 "news_id"를 선택했습니다. , 마지막으로 "user_id, tag_id"를 1 차로 지정하고 "tag_id"는 "favorite_tags"에 넣습니다. 이 올바른지? – caw

+0

어딘가에 보이는 것처럼 보이지만, 테이블을 채우고 'EXPLAIN SELECT'등을하여 두 번 확인하십시오. –

+0

tag_map.tag_id, news.id 및 favorite_tags.user_id에 대한 색인을 원한다고 생각합니다. 질문. –

1

쿼리의 성능 (여부를 귀하의 하위 선택 방법, 또는 프랭크 파머의 더 우아한 가입 기반의 하나)을 주로 인덱스에 따라 달라집니다. MySQL이 테이블 당 하나의 인덱스만을 사용한다는 것을 기억하십시오. 최적화하려는 쿼리에 따라 올바른 인덱스 세트가 항상 명확하게됩니다.

+0

감사합니다. Frank Farmer의 대답에 대한 색인과 관련된 질문을 추가했습니다. – caw