2011-02-08 3 views
2

현재 작은 북마크 응용 프로그램 (MySQL 사용) 용 데이터베이스를 설계하고 있으며 태그 시스템으로 뭔가 영리하게하고 싶습니다. 처음에는 문제가 아니지만 Stack Overflow의 태그 동의어와 비슷한 것을 구현하려고합니다. 각 태그는 여러 태그에 매핑 할 수 있습니다. 이렇게하면 '안녕하세요'라는 태그로 '안녕하세요'라는 태그가있는 책갈피를 반환 할 수 있습니다.Stack Overflow의 태그 동의어와 유사한 기능을 제공하는 태그 스키마

'tags', 'posts'및 'posts_tags'의 세 테이블이있는 다 대다 태그 시스템을 작성하는 데 익숙합니다. 동의어를 이에 맞게 만들려고합니다.

나의 초기 생각은 각 태그가 매핑되는 태그의 ID를 포함하는 '부모'필드를 가질 수 있다는 것이 었습니다. 그러나 이로 인해 고아 태그가 많이 생겨 관리하기가 어려울 수 있습니다. 나는 속도와 우아함을 찾고 있습니다.

아무도 아이디어가 없다면 많은 도움이 될 것입니다. 감사합니다

답변

1

자녀를 부모 테이블로 사용할 수 있습니다. 예를 들어, ChildToParentTags 테이블의 PK로 childTagId를 사용

 
Tags 
tagId, pk 

ChildToParentTags 
childTagId, pk, fk (pk of this table, fk into Tags table) 
parentTagId, fk (fk into Tags table, have an index for this column). 

Post 
postId, pk 

assume many-to-many post to tag relationship 
PostToTag 
postId, pk 
tagId, pk 

는 0 또는 1 부모 태그를 제한하지만 부모가 여러 아이를 가질 수 있습니다. 태그에 의해 게시물에 대한

검색어 :

 
select 
post.postId, 
post.otherStuff 
from 
post 
    inner join postToTag on 
    post.postId = postToTag.postId 
    inner join tag on 
    postToTag.tagId = tag.tagId 
where 
tag.something = 'desired tag value' 
+0

아 좋아요. 그런 다음 태그별로 게시물을 보려면 두 개의 조인을 수행해야합니까? – Rowan

+0

예, 두 개의 조인을 사용하여 태그에서 해당 태그로 마크 된 포스트를 얻습니다. 또한, 아니. tagId가 태그 이름 (예 : "java"또는 "schema") 인 경우 태그 테이블에 조인을 놓을 수 있습니다. – DwB

0

당신은 그룹을 할당하는 시스템을 사용할 수 있습니다. 위에서 언급 한 부모 자식 관계 생성은 많은 도움이되지 않습니다. 그룹 관계를 만들면 검색 속도가 빨라집니다.

그룹이라 테이블 생성 - 동의어 (코드 번호가 할당 될 수 있음)의 groupId 할당한다 있습니다

id, name, groupid 

각 요소. 요소의 이동이 있거나 새 요소가 그룹에 할당되거나 기존 요소가 그룹에서 이동 될 때마다 그룹 ID를 업데이트하면됩니다.

이렇게하면 검색 할 때마다 groupid를 검색하면되므로 검색 속도가 빨라집니다. 동일한 groupid를 가진 모든 요소는 IN 절이 필요없이 검색 될 수 있습니다.

이 테이블은 다른 테이블과 FK 관계가 있다고 가정합니다. FK 관계가있는 곳이라면 PK-FK 관계가있는 "id"대신 FK 관계로 "groupid"를 사용할 수 있습니다.

관련 문제