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

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

내 생각은 이것이다 :

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

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



답변

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

다음과 같은 것 :

표 : 항목
열 : Item_ID, Item_Title, Content

표 : 태그
열 : Tag_ID, Tag_Title

테이블 : Items_Tags
열 : Item_ID, Tag_ID

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


답변

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


답변

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

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

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

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


답변

약간의 비표준 항목을 사용하는 것이 마음에 들지 않으면 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

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


답변

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


답변

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

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


답변

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