2009-07-11 5 views
1

데이터베이스 스키마에 대한 도움을 찾고 있는데 실제 "클라우드"자체가 아닙니다.PHP 태그 클라우드

사용자가 이미지를 제출하고 이미지에 태그를 지정할 수있는 사이트에서 최적의 성능을 위해 데이터베이스를 어떻게 설정해야합니까? 나는 그래서 난 "토론토, 초밥, 여름을"이미지를 업로드하고 태그를 가정

ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

을 생각

.

쿼리는 다음과 같습니다

INSERT INTO tags (tag, imageID) VALUES ('$tag[0]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[1]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[2]', $imageID); 

그런 다음 검색, 어디서 imageID = $ imagID 태그 SELECT * FROM 것입니다.

거기에 결함이 있습니까?

답변

3

이미지에 대한 하나의 테이블, 태그에 대한 테이블 및 이미지 ID와 태그 ID의 조합을 가진 세 번째 테이블 사이에 HABTM (has has and many to many) 관계가 있어야합니다. 이렇게하면 이미지가 가질 수있는 태그의 수나 태그가 속할 수있는 이미지의 수를 제한하지 않고 중복을 방지 할 수 있습니다.

+0

나는 이것을 끝내었다. 주로 이것이 SoF가하는 방식이기 때문에 사용자가 해당 태그를 먼저 생성 한 것과 같이 테이블에 추가 열을 추가 할 수 있습니다. – sqram

3

동일한 태그를 공유하는 이미지가 데이터베이스에 중복 된 항목을 가지고있는 것 외에는이 접근법에 어떠한 실질적인 문제도 보이지 않습니다. 그래도 정상화하려고하면 태그 자체를 보유하는 다른 테이블에 대한 중복 참조를 포함하는 테이블로 끝납니다.이 경우에는 시간 낭비 (MySQL의 코딩, 조인 및 트래버스 테이블)와 같이 보입니다.

하나의 작은 최적화를 고려할 수 있지만 귀하의 열 순서입니다. 'int'를 함께 그룹화하면 MySQL의 고정 너비이므로 int varchar int보다 순서가 조금 더 빨리 검색 할 수 있습니다.

1

나는 별도의 태그 테이블을 사용합니다 : TABLE 태그 : tag_id-의 INT (11), 독특한, auto_incremenet 태그 - VARCHAR를 태그 인 경우 (20)

TABLE image tags: 
ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

그럼 난 찾아 볼 것 이미 거기에 ID 만 삽입합니다.

INSERT INTO 태그 (태그, 이미지 ID) VALUES ('$ tag_id [0]', $ imageID); INSERT INTO 태그 (tag, imageID) VALUES ('$ tag_id [1]', $ imageID); INSERT INTO 태그 (tag, imageID) VALUES ('$ tag_id [2]', $ imageID);

동일한 태그가있는 이미지는 동일한 varchar 콘텐츠뿐만 아니라 동일한 tag_id를 공유하므로 더 쉽게 찾을 수 있습니다. 물론 태그를 소문자로 변환하고 특수 문자 등을 대체해야합니다.

1

imageID 필드에 색인이 있는지 확인하십시오.

2

태그 필드를 char (20)으로 변경하면 성능이 향상됩니까? 전체 테이블은 고정 너비가되고 고정 너비 테이블에서 실행되는 쿼리는 일반적으로 더 빠릅니다. 따라서 DB 디자인에 대한 최근 연구를 믿게되었습니다.

20 자로 고정되면 테이블이 차지하는 공간이 약간 오버 헤드가되지만 어쨌든 큰 파일 크기라면 약간 큰 테이블을 볼 수 없습니다.

사실 사실 아주 작은 테이블이라면 varchar (20)와 char (20)의 차이를보기 전에 많은 데이터 행이 필요할 것이라고 상상해보십시오.

그냥 생각해보십시오. :)

관련 문제