2015-02-05 4 views
0

내 사이트에서 사용자는 여러 개의 태그를 자신의 게시물에 첨부 할 수 있습니다 (StackOverflow와 비슷 함).한 행에 여러 값이 있습니다.

즉, 하나의 열에서 태그를 저장하는 것이 더 좋은가요 :

게시물 테이블

+---------+--------------------+ 
| post_id |  tags  | 
+---------+--------------------+ 
|  1 | first,second,third | 
|  2 | first    | 
|  3 | first,third  | 
+---------+--------------------+ 

아니면 별도로 태그를 유지하기 위해 별도의 테이블을 생성하는 것이 좋습니다, 즉 :

post_tags 테이블

+---------+--------+ 
| post_id | tag | 
+---------+--------+ 
|  1 | first | 
|  1 | second | 
|  1 | third | 
|  2 | first | 
|  3 | first | 
|  3 | third | 
+---------+--------+ 

고마워요!

+1

'Tags'에 대한 세 번째 테이블을 만들고 거기에있는 모든 태그를 추가하지 말고'post_id'와'tag_id' 만있는 브리지 테이블을 만드십시오. – Siyual

답변

0

적어도 선호하는 문제입니다.

의 당신이 옵션을 선택한다고 가정 해 봅시다 post_table

당신은 웹 페이지에서 특정 태그 게시물의 수를 제시하고자합니다. 이렇게하려면 LIKE (또는 태그 열에 FULLTEXT 인덱스가 더 좋은 경우 일치하지 않음)를 사용하여 쿼리를 수행해야합니다. 예 :

SELECT count(post_id) FROM post_table WHERE tags LIKE '%first%'; 

"첫 번째"태그가있는 게시물 수를 알려줍니다. 당신이 옵션을 post_tags을 선택하면

(I 다양한 태그 거기에 "첫 번째"단어가 있다면, 그것은 당신에게 "최초의"태그와 게시물의 잘못된 수를 줄 것이다 것을 깨달았다 코멘트에 감사)

당신은이 같은 간단한 쿼리해야합니다 : 첫 번째 옵션은 잘못된 결과가 테이블에서 검색 할 원인이 될 수 있기 때문에

SELECT count(post_id) FROM post_tags WHERE tag = 'first'; 

을, 두 번째는 선택할 수있는 유일한 옵션이 될 것입니다.

P.D. 또한 각각의 숫자 ID가있는 태그를 보유하는 별도의 "tag_table"을 만들 수 있으며 게시물의 ID와 태그의 ID를 보유하는 "post_rel_tags"라는 공용 테이블을 만들 수도 있습니다. 이렇게하면 관계를 만들기 위해 숫자 값만을 다루기 때문에 데이터베이스의 공간을 절약 할 수 있지만 쿼리는 그렇게 단순하지 않습니다 (실제로는 간단하지만 실제로 제안한 옵션을 사용하면 더 간단합니다).)

+0

데이터베이스 관리자와 개발자에게 중요합니다. 첫 번째 %는 첫 번째 %와 일치합니다. 그래서 첫 번째 장소 또는 headfirst라고하는 태그는 무엇입니까?두 번째 방법 (post_tags)이 유효한 메소드입니다. – Devon

+0

네 말이 맞아, 나는 그걸 고려하지 않았어! 그것은 옵션 2처럼 쿼리를하는 것이 더 좋을 것 같습니다. –

0

귀하의 질문은 다음과 같이 표현할 수 있습니다 : 첫 번째 정규형 (1NF)을 준수하는 것이 더 나은가요?

1NF의 테이블을 쿼리 할 때 항상 단일 값을 키순 검색으로 얻을 수 있습니다. 키순 검색은 사용 가능하고 관련성이있는 인덱스를 사용합니다. 이것이 1NF가 고안된 이유입니다.

태그를 검색 할 필요가 없다면 직접 해결하십시오. 그런데 왜 데이터베이스를 사용하겠습니까?

관련 문제