여러 유형의 객체가있는 경우, 언제 객체가 문자열이어야하고 언제 외국 키가되어야합니까?

StackOverflow https://stackoverflow.com/questions/1005384

문제

로맨스, 소설 또는 미스터리가 될 수있는 책이 있다고 가정 해 봅시다. 이 데이터를 저장할 두 가지 현실적인 옵션이 있습니다. 하나는 내 책 테이블에 "로맨스", "소설"또는 "미스터리"가있는 문자열 인 유형 열을 갖는 것입니다. 다른 하나는 book_types 테이블을 만들고 거기에 유형을 저장하는 것입니다. 그러면 내 책에는 book_types 테이블을 참조하는 type_id 외국 키가 있습니다.

내 질문은 내가 가장 좋은 것을 어떻게 선택합니까? 사용자 상태에 대한 정보가 포함 된 RESTFul Authentication Rails 플러그인에 사용 된 문자열 메소드를 보았습니다.

이 정보를 항상 쿼리 할 것이라는 점을 고려할 때 조회 테이블 메소드를 사용하기위한 성능이 있습니까?

감사!

도움이 되었습니까?

해결책

외국의 주요 접근 방식이 더 잘 수행됩니다. 문자열 비교는 속도가 느려집니다. 숫자를 비교하는 것이 훨씬 빠릅니다.

쿼리 속도를 높이려면 사용중인 열에 외국 키를 참조하기 위해 인덱스를 추가하십시오. 기본 키와 달리 인덱스는 외래 키에 대해 자동으로 생성되지 않습니다.

다른 팁

무언가에 대해 저장해야 할 더 많은 정보가 없다면, 문자열은 일반적으로 괜찮습니다 (이것은 비은 비한 값이므로 정상 형식이 아님).

그러나 이것은 테이블의 좋은 후보처럼 보이므로 카테고리를 사용하여 더 많은 작업을 수행 할 수 있으므로 참조 테이블 IMO 여야합니다.

대부분의 경우 별도의 테이블에 대한 외국 키가있는 접근 방식이 가장 좋습니다.

  • 별도의 테이블은 항목을 검증 할 수있는 확장 가능한 방법을 제공합니다. 테이블 정의에 하드 코딩 된 확인 제약 조건을 넣으면 새 유형을 추가하려면 변경 테이블이 필요합니다.

  • 어떤 이유로 든 유형 텍스트를 변경 해야하는 경우 (예 : "로맨스"-> "여성 소설"이 절름발이 예를 들어) 조회 테이블에 대한 가벼운 업데이트 만 있습니다.

  • 아직 항목이없는 유형이있을 수 있으며 별도의 테이블을 사용하면 외부 조인을 사용하여 SQL 결과 세트의 유형을 포함시킬 수 있습니다.

  • 인터페이스 관점에서 별도의 테이블을 사용하면 UI에서 하드 코딩이 필요하지 않은 유형의 드롭 다운 목록을 쉽게 생성 할 수 있습니다.

성능이 진행되는 한, FK의 적절한 인덱스와 함께 모든 RDBMS 엔진이 잘 작동합니다. 조인은 RDBMS가 설계된 것입니다.

나는 FK를 사용할 것입니다. 더 적은 정보가 복제되었습니다.

편집 : Betther 솔루션 : MySQL 코드 :

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top