데이터베이스에 태그를 저장하는 가장 효율적인 방법은 무엇입니까?


138

내 웹 사이트에서 하나의 stackoverflow 사용과 유사한 태그 시스템을 구현하고 있습니다. 제 질문은-태그를 검색하고 필터링 할 수 있도록 저장하는 가장 효과적인 방법은 무엇입니까?

내 생각은 이것이다 :

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

너무 느려요? 더 좋은 방법이 있습니까?



1
2016 년 현재 Solr 또는 Elasticsearch
Charles L.

답변:


189

하나의 항목에는 많은 태그가 있습니다. 그리고 하나의 태그는 많은 항목에 속합니다. 이것은 다 대다 장애물을 극복하기 위해 중개 테이블이 필요하다는 것을 의미합니다.

다음과 같은 것 :

표 : 항목
열 : Item_ID, Item_Title, Content

표 : 태그
열 : Tag_ID, Tag_Title

테이블 : Items_Tags
열 : Item_ID, Tag_ID

웹 응용 프로그램이 미친 듯이 인기가 있고 길을 비정규 화해야 할 수도 있지만 너무 일찍 물을 흐릿하게 만드는 것은 의미가 없습니다.



tagGroup과 같은 것이 처리 방법과 같은 것이라면 예를 들어 태그는 카테고리로 분류됩니다. 예 : 프로그래밍 언어 : c #, vb, pearl. 운영체제 : windows7, dos, linux 등
Thunder

4
@ Thunder : 하나의 태그가 하나의 범주에만 속한다고 가정하면 category_id와 category_name으로 구성된 TagCategory 테이블을 만듭니다. 거기서, category_id 필드를 Tags 테이블에 추가하고 그에 대한 조인을 수행합니다.
Simon Scarfe

114

데이터베이스 스키마 태그 지정에 대한 Philipp Keller의 블로그 게시물을 읽어야합니다. 그는 몇 가지를 시도하고 결과를 모두보고합니다. 일반적인 쿼리를 구성의 용이성의 측면 , 그리고 성능면에서 . 태그 수, 태그 된 항목 수 및 항목 당 태그 수는 모두 요인이었습니다. 게시물은 2005 년입니다. 그 이후로는 업데이트가 없습니다.


19
이것이 가장 좋은 대답이라고 생각합니다. 그것은 대부분의 다른 답변과 같은 가정보다는 실제 테스트와 연구를 기반으로합니다.
Cristian Vrabie

4
답변의 링크가 작동하지 않는 것 같습니다. vtidter.blogspot.be/2014/02/database-schema-for-tags.html
Christophe Herreman

8

실제로 태그 테이블을 비정규 화하는 것이 규모에 따라 더 나은 방법 일 수 있다고 생각합니다.

이런 식으로 태그 테이블에는 단순히 tagid, itemid, tagname이 있습니다.

중복 된 태그 이름을 얻을 수 있지만 특정 항목에 대한 태그를 추가 / 제거 / 편집하는 것이 훨씬 간단합니다. 새 태그를 만들거나 이전 태그의 할당을 제거하고 새 태그를 다시 할당하지 않아도됩니다. 태그 이름 만 편집하면됩니다.

태그 목록을 표시하려면 DISTINCT 또는 GROUP BY를 사용하면됩니다. 물론 태그를 쉽게 사용하는 횟수도 계산할 수 있습니다.


4

약간의 비표준 항목을 사용하는 것이 마음에 들지 않으면 Postgres 버전 9.4 이상에는 JSON 텍스트 배열 유형의 레코드를 저장하는 옵션이 있습니다.

스키마는 다음과 같습니다.

Table: Items
Columns: Item_ID:int, Title:text, Content:text

Table: Tags
Columns: Item_ID:int, Tag_Title:text[]

자세한 내용은 Josh Berkus의이 훌륭한 게시물을 참조하십시오. http://www.databasesoup.com/2015/01/tag-all-things.html

성능에 대해 철저히 비교 한 다양한 옵션이 있으며 위에서 제안한 옵션이 전체적으로 가장 좋습니다.


2

태그와 항목 사이에 다 대다 관계가 있기 때문에 하나의 항목이 여러 태그와 연관 될 수 있고 하나의 태그가 여러 항목과 연관 될 수 있기 때문에 태그와 항목 연관을 저장하기 위해 중개자 세 번째 테이블을 사용하는 것이 좋습니다. HTH, 밸브.


1

질문에 제공 한 데이터를 기반으로 실제로 속도 저하에 대해 이야기 할 수는 없습니다. 이 개발 단계에서 성능에 대해 너무 걱정해야한다고 생각하지 않습니다. 이를 이른 최적화 라고 합니다 .

그러나 태그 테이블에 Tag_ID 열을 포함시키는 것이 좋습니다. 일반적으로 모든 테이블에 ID 열이있는 것이 좋습니다.


1

공간이 문제가 될 경우 태그에 대한 텍스트를 저장하기 위해 세 번째 테이블 Tags (Tag_Id, Title)를 가지고 태그 테이블을 (Tag_Id, Item_Id)로 변경하십시오. 이 두 값은 고유 한 복합 기본 키도 제공해야합니다.


0

항목에는 "ID"필드가 있어야하고 태그에는 "ID"필드 (기본 키, 클러스터)가 있어야합니다.

그런 다음 ItemID / TagID의 중간 테이블을 만들고 거기에 " 완벽한 인덱스 "를 넣으십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.