내가 제공하는 4 가지 유형의 서비스가 있다고 가정합니다 (빈번히 변경되지는 않음).
- 테스팅
- 디자인
- 프로그램 작성
- 다른
각각 위의 범주 중 하나에 해당하는 60-80 개의 실제 서비스가 있다고 가정합니다. 예를 들어, "서비스"는 "기술 A를 사용한 테스트 프로그램"일 수 있으며 "테스트 중"유형입니다.
데이터베이스로 인코딩하고 싶습니다. 몇 가지 옵션을 생각해 냈습니다.
옵션 0 :
VARCHAR
서비스 유형을 직접 문자열로 인코딩하는 데 직접 사용
옵션 1:
데이터베이스를 사용하십시오 enum
. 그러나 열거 형은 악하다
옵션 2 :
두 개의 테이블을 사용하십시오.
service_line_item (id, service_type_id INT, description VARCHAR);
service_type (id, service_type VARCHAR);
참조 무결성을 즐길 수도 있습니다.
ALTER service_line_item
ADD FOREIGN KEY (service_type_id) REFERENCES service_type (id);
그래요?
그러나 나는 여전히 테이블을 채울 때 물건을 인코딩하고 정수를 처리해야합니다. 또는 테이블을 채우거나 처리 할 때 정교한 프로그래밍 또는 DB 구성을 만들어야합니다. 즉, 데이터베이스를 직접 처리하거나 프로그래밍 측에서 새로운 객체 지향 엔터티를 생성하고 올바르게 작동하는지 확인할 때 참여하십시오.
옵션 3 :
을 사용 enum
하지 말고 두 테이블을 사용하지 말고 정수 열만 사용하십시오.
service_line_item (
id,
service_type INT, -- use 0, 1, 2, 3 (for service types)
description VARCHAR
);
이것은 코드 측면에서 더 많은 오버 헤드가 필요한 '가짜 열거 형'과 같습니다. 즉,이를 알고 {2 == 'Programming'}
적절히 처리 하는 것과 같습니다 .
질문:
현재 개념 2 에 따라 옵션 2를 사용하여 구현했습니다.
- 열거 형을 사용하지 마십시오 (옵션 1)
- 데이터베이스를 스프레드 시트로 사용하지 마십시오 (옵션 0)
그러나 프로그래밍과인지 오버 헤드 측면에서 나에게 낭비되는 것처럼 느껴질 수는 없습니다. 두 테이블을 알고 두 테이블을 처리해야합니다.
'더 적은 낭비 방법'을 위해, 나는보고있다 Option 3
. IT는 더 가볍고 작동하려면 기본적으로 동일한 코드 구성이 필요합니다 (약간의 수정이 있지만 복잡성과 구조는 기본적으로 동일하지만 단일 테이블을 사용함)
이상적으로 항상 낭비가 아니며 옵션에 대한 좋은 사례가 있지만 옵션 2를 사용해야 할 때와 옵션 3을 사용해야 할 때 좋은 지침이 있습니까?
두 가지 유형 (이진) 만있는 경우
같은 장소에서이 질문에 조금 더 추가하려면 "표준"또는 "예외"서비스의 이진 옵션을 사용하면 서비스 광고 항목에 적용될 수 있습니다. 옵션 3 을 사용하여 인코딩했습니다 .
{ "Standard", "Exception"} 값을 보유하기 위해 새 테이블을 작성하지 않기로 선택했습니다. 그래서 내 열은 {0, 1}을 유지하고 열 이름은 exception
이고 코드는 번역을 수행합니다 {0, 1} => {STANDARD, EXCEPTION}
(프로그래밍 언어에서 상수로 인코딩 됨)
지금까지는 그 방법을 좋아하지 않았습니다 ..... (옵션 2 또는 옵션 3을 좋아하지 않음). 옵션 2가 3보다 우수하지만 더 많은 오버 헤드가 있지만 2와 3 중 어느 옵션을 사용하든 정수로 인코딩을 피할 수는 없습니다.
ORM
컨텍스트를 추가하려면 답변을 읽은 후-필자의 경우 Doctrine 2에서 ORM을 다시 사용하기 시작했습니다. 주석을 통해 DB 스키마를 정의한 후 데이터베이스를 채우고 싶었습니다. 전체 데이터 세트가 상대적으로 작기 때문에 프로그래밍 구문을 사용하여 작동 방식을 확인하고 싶었습니다.
실제 스프레드 시트의 기존 목록이 있으므로 먼저 service_type
s를 입력 한 다음 service_line_item
s를 입력했습니다. 따라서 'standard / exception'및 'Testing'과 같은 것은 스프레드 시트의 모든 문자열이며 DB에 저장하기 전에 적절한 유형으로 인코딩해야합니다.
나는 SO 답변을 발견했다 : doctrine2에서 ENUM 대신 무엇을 사용합니까? DB의 enum 구문을 사용하지 말고 INT
프로그래밍 언어의 'const'구문 을 사용하여 필드를 사용하고 형식을 인코딩하도록 제안했습니다 .
그러나 위의 SO 질문에서 지적했듯이 정수를 직접 사용하지 말고 일단 정의 된 언어 구조 (상수)를 사용할 수 있습니다 ...
그러나 여전히 .... 어떻게 돌리 든 관계없이 string
유형으로 시작 하면 ORM을 사용할 때도 먼저 올바른 유형으로 변환해야합니다.
따라서라고 말하면 $str = 'Testing';
여전히 다음과 같은 작업을 수행하는 블록이 필요합니다.
switch($str):
{
case 'Testing': $type = MyEntity::TESTING; break;
case 'Other': $type = MyEntity::OTHER; break;
}
좋은 점은 정수 / 매직 숫자를 처리하지 않고 (인코딩 된 상수 수량을 처리하는 것), 나쁜 점은이 변환 단계없이 데이터베이스에서 자동으로 데이터를 가져오고 꺼낼 수 없다는 것입니다. 지식.
그리고 그것은 부분적으로, "여전히 일을 인코딩하고 정수를 처리해야합니다"와 같은 것을 말함으로써 의미 한 것입니다. (지금, Ocramius의 의견에 따라 정수를 직접 처리 할 필요는 없지만 명명 된 상수와 필요에 따라 상수로 /로부터의 변환을 처리해야합니다).