복붙노트

[SQL] 권장 SQL 데이터베이스 태그의 디자인 또는 태그 [마감]

SQL

권장 SQL 데이터베이스 태그의 디자인 또는 태그 [마감]

나는 태그 구현하는 몇 가지 방법 들었어요; TagID 및 항목 ID 사이에 매핑 테이블을 사용하여의 쉼표 (소리를 구분하는 텍스트 열에서 태그를 유지, (나에게 의미가 있지만, 확장 하는가?), 항목 ID 가능한 TagID 열 고정 된 수의가 (나쁜 생각입니다) 추가 미친하지만 일할 수있는). 난 누군가가 스파 스 매트릭스를 추천 들었지만, 그럼 어떻게 태그 이름이 정상적으로 성장 할거야?

나는 태그에 대한 가장 좋은 방법은 실종?

해결법

  1. ==============================

    1.세 개의 테이블 (모든 항목, 모든 태그 하나와 둘 사이의 관계에 대한 하나를 저장하기위한 하나), 제대로 외래 키가 적절한 데이터베이스에서 실행 세트, 잘 규모 제대로 작동해야 색인.

    세 개의 테이블 (모든 항목, 모든 태그 하나와 둘 사이의 관계에 대한 하나를 저장하기위한 하나), 제대로 외래 키가 적절한 데이터베이스에서 실행 세트, 잘 규모 제대로 작동해야 색인.

    Table: Item
    Columns: ItemID, Title, Content
    
    Table: Tag
    Columns: TagID, Title
    
    Table: ItemTag
    Columns: ItemID, TagID
    
  2. ==============================

    2.일반적으로 나는 Yaakov 엘리스에 동의하지만,이 특별한 경우에 다른 실행 가능한 해결책이 있습니다 :

    일반적으로 나는 Yaakov 엘리스에 동의하지만,이 특별한 경우에 다른 실행 가능한 해결책이 있습니다 :

    두 테이블을 사용합니다 :

    Table: Item
    Columns: ItemID, Title, Content
    Indexes: ItemID
    
    Table: Tag
    Columns: ItemID, Title
    Indexes: ItemId, Title
    

    이것은 몇 가지 큰 장점이 있습니다 :

    이미 항목이 있는지 확인하기 위해 태그 테이블을 조회 할 삽입 및 항목의 업데이트에 대한 세 개의 테이블 용액에 첫째는 훨씬 간단 개발한다. 그럼 당신은 새로운 사람과 그들과 합류해야합니다. 이것은 어떤 사소한 일이 아니다.

    그런 다음 쿼리를 간단하게 (그리고 아마도 더 빠른)합니다. 하나 개의 항목에 대한 출력 모든 태그, 태그 클라우드를 그리고 하나 개의 태그 제목에 대한 모든 항목을 선택 : 세 가지 주요 당신이 할 것입니다 데이터베이스 쿼리가 있습니다.

    하나 개의 항목에 대한 모든 태그 :

    표 3 :

    SELECT Tag.Title 
      FROM Tag 
      JOIN ItemTag ON Tag.TagID = ItemTag.TagID
     WHERE ItemTag.ItemID = :id
    

    표 2 :

    SELECT Tag.Title
    FROM Tag
    WHERE Tag.ItemID = :id
    

    태그 클라우드 :

    표 3 :

    SELECT Tag.Title, count(*)
      FROM Tag
      JOIN ItemTag ON Tag.TagID = ItemTag.TagID
     GROUP BY Tag.Title
    

    표 2 :

    SELECT Tag.Title, count(*)
      FROM Tag
     GROUP BY Tag.Title
    

    하나 개의 태그에 대한 항목 :

    표 3 :

    SELECT Item.*
      FROM Item
      JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
      JOIN Tag ON ItemTag.TagID = Tag.TagID
     WHERE Tag.Title = :title
    

    표 2 :

    SELECT Item.*
      FROM Item
      JOIN Tag ON Item.ItemID = Tag.ItemID
     WHERE Tag.Title = :title
    

    그러나 몇 가지 단점도있다 : 그것은과는 불일치로 이어질 수있는 정규화 아니에요 (느린 더 많은 디스크 작업으로 이어질 수) 데이터베이스에 더 많은 공간이 걸릴 수 있습니다.

    태그의 성격이 크기 증가가 큰 아니다, 그래서 그들은 일반적으로 아주 작은 것을 때문에 크기 인수는 강한 없습니다. 하나는 태그 타이틀에 대한 쿼리가 한 번만 각 태그가 들어있는 작은 테이블에 훨씬 빠릅니다이 확실히 사실이라고 주장 할 수 있습니다. 그러나 가입하는 것을 당신이 쉽게 보상 할 수 그들에 좋은 인덱스를 구축 할 수 있다는 사실하지 않는 점에서 저축을 복용. 물론 이것은 당신이 사용하고있는 데이터베이스의 크기에 크게 의존한다.

    불일치 인수가 너무 작은 논쟁이다. 태그 무료 텍스트 필드하고 ''바 '에 대한 모든 태그의 이름을 변경 "foo는"'와 같은 더 예상 동작이 없습니다.

    그래서 tldr : 나는 두 테이블 솔루션을 갈 것입니다. (사실 나는 갈거야. 내가에 대한 유효한 인수가 있는지 확인하기 위해이 문서를 발견했다.)

  3. ==============================

    3.당신이 지원하는 것을 데이터베이스 사용하는 경우 일반 텍스트 필드에 태그를 저장, CouchDB를 같은지도를-줄이거 나 목록 필드는 실제로 가장 좋은 방법입니다. 예:

    당신이 지원하는 것을 데이터베이스 사용하는 경우 일반 텍스트 필드에 태그를 저장, CouchDB를 같은지도를-줄이거 나 목록 필드는 실제로 가장 좋은 방법입니다. 예:

    tagcloud: {
      map: function(doc){ 
        for(tag in doc.tags){ 
          emit(doc.tags[tag],1) 
        }
      }
      reduce: function(keys,values){
        return values.length
      }
    }
    

    그룹이를 실행하면 진정한 의지 그룹에 태그 이름으로 결과를 =, 심지어 태그가 검출 된 횟수의 수를 반환합니다. 그것은 텍스트에서 단어의 발생을 계산 매우 유사합니다.

  4. ==============================

    4.태그를 저장하기위한 하나의 서식있는 텍스트 열 [1] 및 색인이에있는 전체 텍스트 검색 엔진을 사용합니다. 부울 쿼리를 실행하려고 할 때 다른 사람이 확장 문제로 실행됩니다.

    태그를 저장하기위한 하나의 서식있는 텍스트 열 [1] 및 색인이에있는 전체 텍스트 검색 엔진을 사용합니다. 부울 쿼리를 실행하려고 할 때 다른 사람이 확장 문제로 실행됩니다.

    당신은 당신이 가지고있는 태그에 대한 정보가 필요한 경우 중 하나 점진적으로 유지 테이블에 추적하거나 정보를 추출하는 일괄 작업을 실행할 수 있습니다.

    [1] 어떤 RDBMS 심지어 더 나은 파싱 단계를 필요로하지 않음으로써 저장에 적합 할 수있는 고유의 어레이 형을 제공하지만, 풀 텍스트 검색의 문제를 일으킬 수있다.

  5. ==============================

    5.난 항상 별도의 테이블에 태그를 유지 한 다음 매핑 테이블을 했어. 물론 나도 정말 대규모 아무것도 해본 적이 없다.

    난 항상 별도의 테이블에 태그를 유지 한 다음 매핑 테이블을 했어. 물론 나도 정말 대규모 아무것도 해본 적이 없다.

    는 "태그"테이블을 갖고, 맵 테이블은 쉽게 각 태그를 사용하는 빈도의 카운트와 태그의 목록을 얻으려면 SQL을 함께 넣을 수 있기 때문에 꽤 사소한 태그 클라우드 & 등을 생성 할 수 있습니다.

  6. ==============================

    6.나는 다음과 같은 디자인을 제안합니다 : 항목 테이블 : 항목 ID, taglist1, taglist2 이 신속하고 쉽게 저장 및 항목 수준에서 데이터를 검색 할 것입니다.

    나는 다음과 같은 디자인을 제안합니다 : 항목 테이블 : 항목 ID, taglist1, taglist2 이 신속하고 쉽게 저장 및 항목 수준에서 데이터를 검색 할 것입니다.

    병렬 빌드에서 다른 테이블 : 태그 꼬리표 100 개 항목을 다른 행을 만들 말할 수 포함 2 열 공간이 부족하면 태그의 고유 식별자를하고 있지 않습니다.

    지금은 슈퍼 빠른 것 태그에 대한 항목을 검색하는 동안.

  7. from https://stackoverflow.com/questions/20856/recommended-sql-database-design-for-tags-or-tagging by cc-by-sa and MIT license