2011-01-05 2 views
0

전에 (integer-vs-char-for-db-record-property) 비슷한 질문을했지만 이전 게시물에서받은 모든 권장 사항에 위배되는 것을 발견했습니다. Wordpress 3에서 가장 인기 있고 성숙한 오픈 소스 블로그 스크립트 인 게시 상태는 VARCHAR(20)으로 db에 '게시', '자동 초안', '상속', '보류 중'등으로 저장되며 조회 표가있는 INT이 아닙니다 또는 매핑 된 문자열 상수 또는 CHAR 또는 그와 비슷한 것. 이는 post_type ('게시', '첨부', '수정'등) 필드 및 일부 다른 필드에도 적용됩니다. 게시 된 모든 게시물을 찾으려면 SELECT * FROM posts WHERE post_status = 'published' AND post_type = 'post'과 같은 것을 실행해야합니다. 또한 post_status, post_type 및이 열 종류의 검색을 확실히 가속화하는 다른 열에는 다중 열 인덱스가 있습니다. 누군가가 왜 이런 방식으로 만들어 졌는지 설명 할 수 있습니까? 그리고이 방법의 장점과 단점은 무엇입니까?정수 대 DB 레코드 속성 대 Wordpress 스키마

답변

1

일부 응용 프로그램이 잘 알려져 있다고해서 좋은 데이터베이스 디자인을 가지고 있다는 것을 의미하지는 않습니다. 이것은 정규화 규칙을 위반하는 경향이 있습니다. 어쩌면 그들은 더 나은 성과를 얻었고 어쩌면 그들이 더 나은 것을 알기 때문에 그들이 이것을 선택할 때 다른 가능성을 보지 않았을 수도 있습니다. 어쩌면 그들은 데이터베이스 이론을 잘 이해하지 못하고 데이터베이스를 설계 한 응용 프로그래머 였을 수도 있고, 아니면 그것을 뒷받침 할 수있는 성능 통계가 포함 된 고의적 인 기밀 사항 일 수도 있습니다. 아니면 우리는 가치를 '게시'에서 다른 것으로 변경하기로 결정했을 때 1 억 개의 레코드를 업데이트해야 할 가능성을 생각하지 않았습니다. 어쩌면 그들은 선택에서만 성능을 테스트했지만 업데이트에서는 테스트하지 않았을 것입니다. 어쩌면 유전자 적으로 가치가 바뀌기가 쉽지 않기 때문에 비정규 화하는 것은 그리 큰 문제가 아닙니다. 우리는 여기서 알 수 없습니다.

+2

상태 및 post_type을 문자열로 저장하면 "정규화 규칙을 위반할 수 없습니다"(또는 심지어는 "경향이있다"는 내가 볼 수있는 한이를 위반하게됩니다). Vincent가 설명한 디자인은 데이터베이스가 필요 이상으로 커질 수도 있지만 다른 질문입니다. 정규화는 열에 저장된 데이터 유형에 대해 전적으로 불가지론하며 저장소 크기와는 아무런 관련이 없습니다. 그게 분명해야한다고 생각합니다. – sqlvogel

1

정규화는 문자열을 숫자 또는 "공유"문자열로 바꾸는 것이 아니라 문자가 같기 때문입니다.

나는 디자인을 모르지만 다음 시나리오는 문자열을 식별자로 사용한다고해도 완벽하게 표준화됩니다.

create table post_statuses(
    status varchar(20) not null 
    ,primary key(status) 
); 

insert into post_statuses values('publish'); 
insert into post_statuses values('inherit'); 
insert into post_statuses values('pending'); 

create table posts(
    post_id ... 
    status varchar(20) not null 
    ,primary key(post_id) 
    ,foreign key(status) references post_statuses(status) 
); 

대리 키 자연 키를 사용하여의 주요 장점은 필요한 조인의 수 또한 쿼리의 전체 클래스는 인덱스에서 대답 할 수있는 동반 할 가능성을 줄일 수 있다는 것입니다. 가장 큰 단점은 스토리지를 늘리고 값을 변경해야하는 경우 지옥에 빠질 가능성이 있다는 것입니다.

0

나는 WP 개발자들이 조기 최적화라고 느낀 것을 그냥 피하고 대신 더 나은 가독성을 선택했다고 생각합니다.

"SELECT * FROM posts WHERE post_status = 'published' AND post_type = 'post'" 

"SELECT * FROM posts WHERE post_status = ".WP_POST_STATUS_PUBLISHED." 
    AND post_type = ".WP_POST_TYPE_POST."" 

그리고 새로운 WP 개발자, 데이터베이스 표보다는 3 또는 5를 '출판'는 select * from ... 쿼리를 실행하면, 쉽게보다 읽기 조금 조금 더 쉽게 이해하고 디버그 할 수 있습니다. 디스크 저장 공간의 관점에서

, 두 접근 방식은 내가 생각하는 상당히 괜찮습니다 - 좀 더 post_status 바이트별로 중요하지 블로그 게시물 텍스트 다른 모든 열을 비교해야한다. 정수는 8 바이트입니다 (tinyint가 아닌 한). 'published'는 아마도 10 바이트입니다. 따라서별로 중요하지 않습니까?