2012-02-14 6 views
8

이것은 가능한 최선의 최적화 된 방법으로 생각하고 올바른 생각을하는 데 더 많은 시간을 낭비하는 문제입니다."해시 태그"시스템을 만드는 가장 좋은 방법

"Contents"테이블이 있으며 "해시 태그"또는 "태그"또는 "키워드"를 콘텐츠에 연결하는 옵션을 추가해야합니다. 예를 들어 "튀긴 감자와 케첩"과 같은 콘텐츠는 "열쇠": "감자", "케첩", "튀김".

단어로 검색하면 (예 : "감자"),이 단어에 태그가있는 콘텐츠를 표시해야합니다.

질문은 콘텐츠 테이블이 Millon 행 30 개 이상인 MyISAM이므로 결과의 속도를 고려하여이 작업을 수행하는 데 가장 적합한 구조입니다.

내가이 생각 :

2 개 이상의 테이블을 확인, "contents_hashtags"

사용자가 생성/테이블 내용을 수정 이노

에서 (id(INT11), content_id(INT11), hashtag_id(INT11))와 "해시 태그" (id(INT11), hashtag(VARCHAR(40))) 2 테이블, 난에서 검색 해시 태그 테이블을 생성하고 존재하지 않는 해시 태그가있는 경우 해시 태그 테이블에 생성하고 ID가 있으면이 ID를 사용하여 테이블에 삽입합니다 contents_hashtas 내용을 연관 시키십시오 < -contents_hashtas-> hashtahs

검색 할 때 JOINS (LEFT/RIGHT/INNER 젠체하는 ..)와 같은 검색을 만들 ?? exact (hashtag = "XXX") 또는 전체 텍스트 검색?

이 방법이 정확하고 빠릅니까? 나는

답변

2

사실, 하나 개의 별도의 테이블이 충분히

"해시 태그"(아이디 (INT11), 해시 태그 (VARCHAR (40))), content_id가있다 .. 큰 행 수와 큰 트래픽이 실행하는 방법을 잘 모릅니다 (int11))

이제 hastag를 이름으로 추가 할 수 있습니다. 콘텐츠에 대한 모든 해시 태그를 얻으려면,

SELECT hashtag FROM hashtable WHERE content_id=$content_id 

가하는 제거를 해시 태그를 추가의 ID 또는 해시 태그 자체를 사용하여 삭제하는 데 사용합니다.

내용, 해시 태그, 그리고 ConTags : 단지 트릭을 할 것입니다

3

세 개의 테이블에

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

등을 사용하여, 특정 hastags에 대한 콘텐츠를합니다. ConTags는 contents.id 및 hashtags.id가 들어있는 접합 테이블입니다. 이 방법으로 여러 해시 태그를 Contents의 각 항목에 지정할 수 있습니다.

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

는 다른 방법으로, 해시 태그 이름콘텐츠 ID 고유 키와 접합 테이블이 더 이상

+0

필요한 설정 어떤 방법이 검색에 빨리입니까? 3 테이블 또는 2 테이블 방법? 3 테이블 메서드는 JOIN에 의한 직접적인 관계이지만 2 테이블 메서드에서 해시 태그는 내용에 대해 "복제"됩니다 (id + hashtag 캔트 반복). 예를 들어 search : content.active = 1 AND (내용 .name = 'xxx'또는 (Contags.hashtag = 'XXX'및 Content.id = Contags.content_id)) – Zenth

+0

Upvoted "또는 Hashtags Name 및 ContentId를 고유 키로 설정". 3 개의 테이블 2가 필요하지 않습니다. – DeepBlue

관련 문제