2012-10-28 2 views
0

특정 태그를 항목에 할당하는 작은 시스템이나 정확한 사람을 지정하려고합니다. 그래서, 나는 명단과 태그 목록을 가지고있다. 각 사람에게 3 가지 특정 태그를 지정해야합니다 (이 사람이 가질 수있는 3 가지 기술에 해당). 간단히 말해서특정 태그를 항목에 할당하는 데이터베이스 디자인

, 출력은 다음과 같을 것이다 :

Person 1 | webdesign, ux, jquery 
Person 2 | blogging, photography, wordpress 
Person 3 | graphic-design, 3d, inventor 
... 

지금은, 그 목록은 두 개의 서로 다른 테이블에 저장됩니다

내 주요 목표는 반복과에를 방지하는 것입니다 기존 사람에게 3 개의 기존 태그를 지정하기 만하면됩니다.

구현 방법에 대한 몇 가지 힌트를 제공해 주시겠습니까? three-table 디자인은 태깅 시스템에 일반적이지만 내 상황과 관련이 있습니까?

도움 주셔서 감사합니다.

답변

3

당신이 어떤 중복이없는 한 다음 제대로 당신이 tagsperson

에 연결하는 세 번째 테이블을 필요 표준화 된 디자인을 구현하기 위해, 사람에게 N 태그를 추가 할 수 있도록하려면
persons_2_tags 
-------------- 
person_id 
tag_id 

고유성을 보장하려면 복합 기본 키를 사용하거나 두 열을 모두 포함하는 표에 unique index을 추가하십시오.

위의 예를 SQL Fiddle에서 확인하십시오. 데이터베이스 수준에서 3 태그 제한을 적용해야하는 경우

, 당신은 1, 2, 3의 값과 enum을 인 persons_2_tags 테이블 (예를 들어 tag_number)에 세 번째 열을 추가하고 unique index에 그것을 추가 할 수 있습니다. 삽입 논리는 응용 프로그램 수준에서 처리해야하지만 index에 의해 적용됩니다.

+0

정확합니다. 그리고 유일성을 얻으려면 person_id와 tag_id 열의 조합에 고유 한 제한 조건을 추가하십시오. – Marvo

+1

죄송합니다. 내 생각의 기차를 잃어 버렸습니다 ... 실제로는 기본 키 조합을 사용합니다. – doublesharp

+0

위대한, 그것은 내가 마음에 가지고 있었던 거의 것이다. 제가 설명했던 것을하기 위해 저에게 3 개의 테이블을 악용 할 수있는 전형적인 요청을 보여줄 수 있습니까? – morgi

1

"정확히"3 개의 태그를 지정해야합니까?

세 번째 테이블은 정규화 된 상태를 유지하는 것이 좋습니다. 일반적인 다 대다 관계입니다. 이는 사용자/태그 쌍을 무제한의 고유 한 목록으로 가질 수 있기 때문에 최대한의 유연성을 제공합니다.

각 태그에 대해 사용자 테이블에 3 개의 열을 포함 할 수 있습니다. 성능은 유연성을 희생시키면서 향상 될 것입니다. "tag = 'X'인 모든 사용자를 나열하는 쿼리는 조금 더 어렵습니다. 3 개 미만의 태그를 허용하면 여러 개의 null 값이있을 수 있습니다. 물론이 설정에서는 새로운 열과 많은 코드를 만들어 세 개의 열을 넘어 확장해야합니다.

+0

참으로 제약이 있습니다. 각 사람마다 반드시 3 개의 태그가 할당되어야합니다. – morgi

0

나는 아마 제프 O 그러나, 단지 다른 관점을 제시, 언급 한 세 개의 테이블 디자인을 할 것이라고 생각 ...

그냥 태그에 대해 이야기하고 있다면, 그건이며, 다른 메타 데이터가없는 짧은 문자열, 나는 당신이 이 필요하다는 것을 모른다.tags 테이블이다. 본질적으로 태그 자체가 ID 일 수 있습니다.

persons (person_id, person_name); 
tags (person_id, tag); 

그래, 거기에 약간의 반복이 생기 겠지만, 어쨌든 짧은 문자열이라면 실제로 효과가 있어야합니다.

관련 문제