내 웹 사이트에서 하나의 stackoverflow 사용과 유사한 태그 시스템을 구현하고 있습니다. 제 질문은-태그를 검색하고 필터링 할 수 있도록 저장하는 가장 효과적인 방법은 무엇입니까?
내 생각은 이것이다 :
Table: Items
Columns: Item_ID, Title, Content
Table: Tags
Columns: Title, Item_ID
너무 느려요? 더 좋은 방법이 있습니까?
내 웹 사이트에서 하나의 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, 밸브.