2010-07-19 6 views
1

나는 tagging stuff가 여러 번 언급되었지만이 질문에 답할 수는 없다. 설정 태그에이 스레드 Recommended SQL database design for tags or tagging다른 엔티티와 태그를 공유하는 경우 태그 지정을 구현하는 방법은 무엇입니까?

내가 가장 좋은 방법을 볼 수 있습니다에서

은 가능성이

Item (item_id, item_content) 

Tag (tag_id, tag_title) 

TagMapping(map_id, tag_id, item_id) 

그러나 나는 두 개의 서로 다른 항목 엔티티 사이의 태그를 공유하려면? 예를 들어, 블로그 게시물 및 기사. (별개의 엔티티인지 아닌지에 대해 논의하지 않겠습니다.) 매우 잘못된 것처럼 보이는 이와 같은 것을합니까? 당신이 (당신의 태그가 비정규 될 MongoDB를 같은 문서 기반 솔루션을 사용 반대)이 스키마에 대한 관계 매핑을 유지하려면

Post (post_id, post_content) 
Article (article_id, article_content) 

Tag (tag_id, tag_title) 

TagMapping(map_id, tag_id, post_id(nullable), article_id(nullable)) 

답변

3

정통적인 대답은 게시물과 기사 사이에 테이블 상속 전략을 사용하는 것입니다. 그들에게 두 종류의 아이템을 만들어라. 그래서 (이 SQL은 완전한 넌센스가 될 수 있지만, 당신은 아이디어를 얻을) :

create table Item (integer item_id primary key) 
create table Post (integer item_id primary key references Item, varchar(2000) post_content) 
create table Article (integer item_id primary key references Item, varchar(2000) article_content) 
create table Tag (integer tag_id primary key) 
create table TagMapping (integer item_id references Item, integer tag_id references Tag, constraint primary key (item_id, tag_id)) 

그래서 기사와 게시물 모두는 항목 테이블에 존재하고, 그 태그에 참조거야.

지금하는 것처럼 게시물 및 기사를 검색 할 수 있습니다. 태그로 검색하려는 경우 Item을 통해 조인을 수행합니다. 해당 조인의 세부 정보를 검색하려면 게시 및 아티클 모두에 대해 외부 조인을 수행 한 다음 Null 열을 무시해야합니다.

또한 'integer subtype_discriminator not null'과 같은 상위 테이블에 항목이 있습니다 (항목이 게시물 인 경우 1, 기사 인 경우 2, 따라서 어떤 열을 무시할지 또는 간단한 조인 후에 두 번째 쿼리를 수행하려는 경우 세부 정보를 찾는 위치를 쉽게 알 수 있습니다.

+0

각 개체 테이블 (게시/아티클)에 Item 테이블을 참조하는 item_id 열이 있다고 제안 하시겠습니까? –

+0

예, 이것도 기본 키입니다.Post 및 Article 테이블은 기본적으로 Item에 대한 보조 테이블이며 기본 테이블입니다. –

+0

그래서 주어진 패턴과 일치하는 태그가있는 모든 게시물을 원하면 post p, tagmapping tm, tag t에서 distinct p. *를 선택하십시오. 여기서 p.item_id = tm.item_id 및 tm.tag_id = t.tag_id 및 t.label like '% foo %' –

0

당신은 매핑 하나 개 더 수준을 만들 수 있습니다.

이 상황에서 사용하는 규칙은 같은 종류의 모든 항목을 'ilktype'이라고하고 각 항목을 '루 브릭'이라고 부르기 때문에 ilktype 블로그 게시물에는 많은 루 브릭이 있습니다 (게시물). 이 스키마에 어떻게 보일지

은 다음

Post(post_id,post_content) 
Article(.....) 
Foo(.....) 
Tag(tag_id,tag_title) 
TagMapping(map_id,tag_id,ilktype_id,rubric_id) 

는 그런 언급 된 항목을 검색 할 수 있습니다 후 설정 파일에서 또는 ilktype 테이블에서 상수로 중, ilktypes의 목록을 유지하고, to를 적절한 테이블 (post/article/foo)에 ilktype_id를 결합하여 태그 매핑 테이블에 추가하십시오.

1

당신은 "태그 보드"엔티티에 태그를 부착하고 태그해야 모든 엔티티 한 첨부 할 수 있습니다

TagBoard (tagboard_id) 

Post (post_id, tagboard_id, post_content) 
Article (article_id, tagboard_id, article_content) 

Tag (tag_id, tag_title) 
TagMapping (map_id, tag_id, tagboard_id) 

을 역을, 당신은 포스트와 기사 모두가 "Taggable에서 상속 할 상속을 사용할 수 있습니다 "엔티티 (또는 일반"항목 "엔티티에서 더 많은 유연성을 허용하기 위해). 드루팔 (Drupal)은 특히이 작업을 수행합니다 (게시물 및 기사와 함께 Drupal 데이터베이스에서 노드).

관련 문제