열거 형과 테이블을 동기화 상태로 유지


11

데이터를 데이터베이스에 게시하는 프로그램을 만들고 있는데 익숙한 패턴으로 실행되었습니다. 열거 형으로 사용되는 가장 가능성이 높은 고정 값의 짧은 테이블. 따라서 다음과 같은 테이블이 있다고 가정하십시오 Status.

  상태
  ID 설명
  --------------
   0 미처리
   1 대기 중
   2 가공
   3 오류

내 프로그램에서 다른 테이블의 상태 ID를 결정하거나 새로운 상태 ID로 레코드를 업데이트해야합니다.

열거 형으로 상태 ID를 하드 코딩 할 수 있었고 아무도 데이터베이스를 변경하지 않기를 바랍니다. 또는 내가 설명에 따라 값을 미리 가져올 수있다 (따라서 하드 코딩하는 것을 대신).

열거 형과 테이블을 동기화 유지하는 올바른 접근 방법은 무엇입니까?


동기화하지 않고 동기화 상태를 유지하는 이유는 무엇입니까? Synch (말씀)가 이상합니다!
MrFox

1
@suslik 그들은 모두 같은 발음입니다. 동기화동기화 .
MPelletier

1
열거 형과 데이터베이스 테이블을 갖는 것은 중복입니다. 데이터베이스 테이블을 다른 응용 프로그램에서 사용하지 않는 한 테이블을 포기하고 열거 형을 사용합니다. 테이블을 여러 앱에서 사용하는 경우 대신 런타임시 데이터베이스에서 상태를로드하십시오.
피터 스미스

상황에 따라 다릅니다. 이 경우 워크 플로 또는 작업 상태 값이므로 프로세스가 변경되는 경향이 있으므로 정적보다 동적으로 유지하는 것이 좋습니다. 소프트웨어 출시 일정에 따라 대역 외를 변경하는 경향이 있습니다. 반면에 새로운 상태가 도입되거나 기존 상태가 제거되지 않는 안정적인 서비스라면 열거 형을 하드 코딩 / 비정규 화해야합니다 (레코드가 나중에 사용되는 방식에 따라 다름).
JustinC

@PeterSmith 데이터베이스가 Java 열거 형에만 있고 테이블이 아닌 경우 제약 조건을 적용 할 수 없습니다. 데이터베이스의 값을 제한하지 않습니까?
David Conrad

답변:


5

이러한 다른 상태가 프로그램 논리에 영향을 미치는 것으로 생각되므로 프로그램 내에서 열거 형을 하드 코딩 할 것입니다. 새로운 지위를 가지고 있다면 프로그램은이 새로운 지위에 어떻게 대응해야합니까?

데이터베이스는 응용 프로그램의 일부이기 때문에 다른 종류의 말을하지 않고 데이터베이스에 영향을 미치는 것은 의미가 없다고 생각합니다.


새로운 상태 (데이터베이스와 프로그램 모두의 수정을 확실히 보장해야 함)에 대한 것이 아니라 ID 값입니다.
MPelletier

2
의미를 변경하지 않고 ID 값을 변경하는 이유를 모르겠습니다. 이러한 종류의 열거는 자동으로 증가하지 않으며 일반적으로 응용 프로그램에서 쿼리를 수행 할 때 데이터베이스를 디버깅하는 사람들이 쉽게 읽을 수 있도록하기위한 pending것이며 ID가 무엇인지 이미 알고 있을 것입니다. 물론 Status테이블을 갖는 것은 참조 무결성을 제공하지만 그것은 내가 만들고자하는 요점입니다.
Matthew

그래, 그 생각이야. 그러나 ID를 다른 곳으로 설정하면 둘 다 옳다는 가정 을하고 있습니다. 연결이 느슨하지 않습니까?
MPelletier

3
우리는 항상 이러한 가정을합니다. 테이블 정의를 생각하면, 프로그램은 쿼리를 작성할 때 정의가 그런 것으로 가정합니다. Status테이블은 응용 프로그램의 실행을 통해 동적으로 간주해서는 안되며, 따라서 나는 당신이 같은 읽을한다고 생각하지 않습니다.
Matthew

8

일반적으로 응용 프로그램을 시작할 때이 데이터를 정적 캐시 (일반적으로 HashMap 또는 이와 유사한 것)에로드합니다. 열거 형이 어떤 식 으로든 수정 되었기 때문에 다시 컴파일하지 않아도됩니다.


2

이러한 상태는 DB 변경으로 인해 프로그램이 손상되지 않도록 (적어도 쉽게는) 응용 프로그램에 하드 코딩되어야합니다. 추가해야하는 모든 상태는 먼저 DB에 추가되는 것이 아니라 먼저 코딩되어야하므로 이는 중요합니다.

예를 들어 보고서를 가져와야 할 경우를 대비하여 올바른 설명과 함께 해당 상태 값을 DB에 기록해야합니다.

일반적으로 DB에 연결하고 특정 테이블에 나열된 상태가 모두 메모리에 하드 코딩 된 것과 동일한 id / name 값을 갖는지 확인하는 작은 코드 스 니펫이 있습니다. 그들이 일치하지 않으면 소프트웨어 실행을 중단합니다.

요구 사항에 따라 약간 다른 동작을 구현할 수도 있지만 전반적으로 이러한 상태를 하드 코딩하는 것이 좋습니다.


2

내 프로젝트에서 비슷한 문제가 있습니다 (레거시 코드, hooray!) 주요 문제는 "열거 테이블이 변경되지 않고 코드가 끊어 질 때까지"변경되지 않는다는 것입니다. 느리게 마이그레이션하고있는 두 가지 전략이 있습니다.

가장 좋은 방법은 가능할 때마다 이러한 값에 대한 직접적인 참조를 제거하는 것입니다. 항상 "왜 열거 형 값을 직접 사용해야합니까?" 많은 경우에 이것은 코드에 하드 코딩 된 가정이 너무 많거나 데이터를 너무 많이 조작하려고한다는 신호입니다. 조작중인 대상을 처리하기 위해 데이터베이스 또는 더 유연한 코드에서 더 나은 관계를 만들 수 없는지 확인하십시오.

그것이 작동하지 않으면 계획 B : 코드 생성으로 이동하십시오. 테이블이 자주 변경되지 않고 정기적으로 새 빌드를 게시하므로 코드 생성기가 열거 테이블을 읽고 열거 코드를 작성할 수 있습니다. 그런 다음이 동적으로 생성 된 라이브러리가 프로젝트에서 사용됩니다. DB가 변경되면 다음 빌드가 컴파일되지 않으므로 신비한 런타임 오류를 얻는 것보다 훨씬 낫습니다.


열거 형에 대한 참조를 어떻게 제거 하시겠습니까? 예를 들어이 경우 상태별로 정렬하거나 검색합니다. DB에 마법의 가치가 있다는 것도 나와 잘 어울리지 않습니다. 이것이 찾아보기 테이블입니다.
nportelli

과거에는 그 반대였습니다. 응용 프로그램 부팅시 Enum에 코드가 변경 될 때마다 해당 값이 데이터베이스에 동기화됩니다. 여기 코드는 진실의 원천입니다. 데이터베이스는이를 나타냅니다. 일반적으로 코드에서 이해할 수없는 DB의 값을 무시하지만이 방법으로 필요한 경우 자동으로 DB를 정리하는 메커니즘을 얻습니다.
Anshul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.