2017-02-07 17 views
2

반대 문제는 this guy입니다. DBIC가 해당 상태 오브젝트가 작성 될 필요가 있는지 확인하기 위해 SELECT를 수행하거나 가진 경우 일 것이다 배후관련 객체를 다시 패치하지 않고 행을 만드는 방법은 무엇입니까?

$rs->create({ foo => 'bar', 
       status => { label => 'Active' } }); 

:

나는 많은이 패턴을 사용하는 데 사용하는 응용 프로그램이 레이블 "활성"이 존재합니다. 그것이 존재한다면 ID는 내가 생성하는 객체의 FK 값으로 사용됩니다.

문제는 상태 테이블이 거의 변경되지 않으며 상태가 너무 많지 않으므로 99.99 %는 기본적으로 DB에 대한 쿼리 낭비입니다. ENUM을 대신 사용하려고 생각했지만 응용 프로그램의 초기 단계 였기 때문에 처음 몇 주 동안 몇 가지 새로운 상태가 나타날 수밖에 없었습니다. INSERT는 ***에서 ALTER TABLE status CHANGE label label ENUM(...)보다 고통이 적습니다. 또한 테이블에 추가하면 UI에서 드롭 다운을 만들기 위해 가능한 값을 쉽게 나열 할 수 있습니다.

이제 우리는 THING 라벨을 가지고 ID를 반환하는 get_THING_id 함수를 가지고 있습니다. get_THING_id 기능 memoized이며 우리는이 작업을 수행 :

$rs->create({ foo => 'bar', 
       status_id => get_status_id('Active') }); 

그것은 매우 DBIC-y를 생각하지 않으며 그것은 사방에 사람들을 가져올 필요가 어색합니다.

글 머리 기호를 물고 단지 ENUM을 사용해야합니까? 사람들이 이런 종류의 작은 테이블을 어떻게합니까?

+0

Result 객체를 첫 번째 코드 블록의 구문과 함께 'status'로 전달할 수 있습니까? – simbabque

+0

@simbabque 필자는 하나도 갖고 있지 않기 때문에''Active "=> $ active_status'와 같은 맵을 유지하는 것을 의미 할 것입니다. 기본적으로 다시 memoization입니다. –

답변

1

DBIC 스키마에는 모든 정적 항목에 대한 상수가 들어있는 상수 클래스 (패키지)가 있습니다. 이러한 테이블의 내용이 변경되는 경우 일반적으로 스키마 또는 응용 프로그램 논리를 수정해야하므로, 상수를 추가/변경하는 것은 문제가되지 않습니다.

+0

그럼 별도의'status' 테이블을 사용하지 않고 그냥 상수일까요? 이점을 볼 수는 있지만 필드에 FK 제약 조건이 없으므로 임의의 값을 입력 할 수 있습니다. –

+0

우리는 제약 조건을 사용하여 유효한 값을 적용하기 위해 해당 테이블을 가지고 있습니다. –