전에 (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 억 개의 레코드를 업데이트해야 할 가능성을 생각하지 않았습니다. 어쩌면 그들은 선택에서만 성능을 테스트했지만 업데이트에서는 테스트하지 않았을 것입니다. 어쩌면 유전자 적으로 가치가 바뀌기가 쉽지 않기 때문에 비정규 화하는 것은 그리 큰 문제가 아닙니다. 우리는 여기서 알 수 없습니다.
정규화는 문자열을 숫자 또는 "공유"문자열로 바꾸는 것이 아니라 문자가 같기 때문입니다.
나는 디자인을 모르지만 다음 시나리오는 문자열을 식별자로 사용한다고해도 완벽하게 표준화됩니다.
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)
);
대리 키 자연 키를 사용하여의 주요 장점은 필요한 조인의 수 또한 쿼리의 전체 클래스는 인덱스에서 대답 할 수있는 동반 할 가능성을 줄일 수 있다는 것입니다. 가장 큰 단점은 스토리지를 늘리고 값을 변경해야하는 경우 지옥에 빠질 가능성이 있다는 것입니다.
나는 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 바이트입니다. 따라서별로 중요하지 않습니까?
- 1. 포트란 : 정수 * 4 대 정수 (4) 대 정수 (종류 = 4)
- 2. Postgresql 하나의 스키마를 가진 다중 스키마 대 다중 스키마 대
- 3. 튜플 대 레코드
- 4. OLAP 대 열 DB
- 5. 부동 소수점 대 정수 성능
- 6. Xml 속성 대 Xml 속성?
- 7. 속성 대 인스턴스 변수
- 8. radGrid 새 레코드 추가 대 레코드 편집
- 9. WordPress 2.9.2 대 WordPress 3.0 출시 후보자
- 10. DB 인덱스 속도 대 캐싱
- 11. PHP 세션 대 DB 조회
- 12. Drupal 대 WordPress 성능 비교
- 13. Wordpress Database $ wpdb 대 get_option()
- 14. Python db-api : fetchone 대 fetchmany 대 fetchall
- 15. 키 - 밸류 스토어 대 RDBM 대 "클라우드"DB (SDB)
- 16. 대 ID 대 UniqueID 대 ClientID 대 UniqueClientID 대 StaticClientID?
- 17. 속성 대 MultiConverter WPF 변환기?
- 18. MonoTouch - 필드 대 자동 속성
- 19. GCC 함수 속성 대 캐싱
- 20. WPF DataTrigger 대 .Net 속성
- 21. Visual Basic 기본 속성 대 C# 속성
- 22. CSS 글꼴 속성 대 텍스트 속성
- 23. Java/JSP의 문자열 대 정수 변환
- 24. 루비 정규식 MatchData 대 정수 변환
- 25. Delphi : 레코드 생성자 대 팩토리 함수
- 26. 1 대 1 관계로 두 레코드 삭제하기
- 27. ASP 클래식 - 레코드 개체 대 명령 개체
- 28. iPhone 대 XML 대 비누 대 JSON 대 RESTful
- 29. 부 대 대 C# 대 파이썬?
- 30. SDI 대 MDI 대 TDI 대?
상태 및 post_type을 문자열로 저장하면 "정규화 규칙을 위반할 수 없습니다"(또는 심지어는 "경향이있다"는 내가 볼 수있는 한이를 위반하게됩니다). Vincent가 설명한 디자인은 데이터베이스가 필요 이상으로 커질 수도 있지만 다른 질문입니다. 정규화는 열에 저장된 데이터 유형에 대해 전적으로 불가지론하며 저장소 크기와는 아무런 관련이 없습니다. 그게 분명해야한다고 생각합니다. – sqlvogel