2009-04-24 4 views
1

나는 많은 기존의 종이 양식을 대체 ASP.NET 프로젝트에서 일하고 있어요. 요구 사항 중 하나는 사용자가 모든 상태에서 양식을 저장할 수 있다는 것입니다. 즉, 양식을 새로 만들고 즉시 데이터가 없거나 부분 데이터로 양식을 저장할 수 있습니다. 모든 저장시 데이터 유형에 대해 유효성을 검사하고 있지만 필수 필드에 대한 유효성 검증은 사용자가 양식을 완료된 것으로 표시 할 때까지 발생하지 않습니다.nulls 허용 기본값과

데이터베이스 및 도메인 모델에서이 요구 사항을 처리하는 것이 가장 좋은 방법인지 모르겠습니다. 보시다시피 두 가지 옵션이 있습니다 :

  1. 데이터가 없을 수있는 필드에는 null을 허용합니다. 이것은 "올바른"접근 방식과 같지만 거의 모든 데이터베이스 필드에서 null을 허용해야하며 nullable 유형을 많이 코딩해야합니다. 또한 양식이 마무리되면 필수 필드가 데이터베이스에 적용되지 않습니다.
  2. 내 비즈니스 오브젝트를 의미있는 기본값으로 채 웁니다. 어떤 경우에는 사용할 수있는 많은 필드 (전부는 아님)에 대해 의미있는 기본값이 있습니다. 이 접근 방식은 나를 "불편하게하는" "마법의 숫자"를 나타냅니다.

어떤 접근 방식이 가장 좋습니까? 아니면 세 번째 방법이 있습니까? 나는 테이블을 나누는 것과 같이 극단으로 갈 의사가 없다.

편집 추가 : 응답을 수락 한 이후부터 조금 더 확장하고 싶었습니다. 테이블 분할에 관심이없는 주된 이유는 일단 프로젝트가 제출되면 양식의 데이터가 레코드 시스템 인 다른 시스템의 데이터를 생성하는 데 사용된다는 것입니다. 이 시점에서 원래의 양식 데이터는 수정되거나보고에 사용되지 않을 것입니다.

+1

두 세트의 테이블을 사용하십시오. 하나는 불완전한 양식 용이고 하나는 완성되고 검증 된 양식 용입니다. 절대적으로 필요한 경우가 아니면 유효성이 검증 된 양식의 테이블에 널 (null)을 허용하지 말고 가능하면 적게하십시오. –

답변

1

현명한 기본값이없고 데이터를 분할하지 않으려면 null이 거의 확실합니다. 데이터베이스가 완료 될 때 null이 아닌지 확인하는 것이 아니라 ... 테이블을 분할하고 싶지 않으면 수행 할 수있는 작업이 많지 않습니다 (CHECK 제한 사용 또는 INSTEAD OF 트리거 사용 불가). 검증 실행). 그러나 DB는 데이터 유효성 검증을 담당하는 장소 만이 아닙니다. 앱 로직도 그렇게 할 수 있습니다.

2

왜 테이블을 분할하고 싶지는 않습니다. 사람의 두 부류가있다 나는 당신이있어 어떤 도메인 모르지만 어떤에서 나는 상상할 수 : 양식을 제출 한

  • 명하지

  • 명 그리고 비즈니스 경영자로서 저는 두 번째를 신경 쓰지 않습니다. 그러나 처음에는 깊이 생각하고, 모든 데이터를 올바르게 작성해야합니다.

    또한 효율성을 향상시킵니다. 집계 데이터에 대한 대부분의 쿼리는 두 번째 테이블이 아닌 첫 번째 테이블에 대한 것입니다. 두 번째 테이블은 인덱스 검색에만 사용됩니다.

  • +0

    프로세스에서 논리적으로 테이블을 분할 할 수있는 잘 정의 된 단계가 없습니다. 실제로 작동하게하려면 진행중인 양식과 완성 된 양식의 두 세트를 유지해야합니다. 이 프로젝트는 그만큼의 노력을 보증하지 않습니다. –

    0

    첫 번째 옵션을 사용하지만 양식이 완료 될 때 데이터베이스 테이블에 열을 추가하여 플래그가 지정됩니다. 그런 다음 양식 데이터를 사용하는 경우 양식이 완료되었는지 확인하기 만하면됩니다.

    이 문제를 해결하기위한 제 제안입니다.

    +0

    예, 이미 그 깃발이 있습니다. 말 그대로 양식이 완성되었음을 나타내는 상자를 확인하는 사용자의 문제입니다. –

    +0

    나는 그 값을 데이터베이스에 넣고 값을 설정하기 위해 그 열의 체크를 사용하도록 객체 모델을 변경하는 것을 의미했다. 필요한 필드가 모두 채워지지 않으면 finalized 열이 설정되지 않기 때문에 비즈니스 로직 내에서 필수 필드가 적용됩니다. –

    1

    모든 열에 "null 허용"이 포함 된 임시 테이블을 사용하여 데이터의 일부 또는 전부를 포함하는 양식을 저장하고 사용자가 완료된 것으로 양식을 표시 할 때 데이터를 최종 테이블에 복사/이동할 수 있습니다.이렇게하면 사용자가 변경하는 것을 잊어 버릴 수도있는 기본값에 의존하지 않고 모든 상태로 저장할 수 있으며 마지막에는 유효성 검사를 계속 수행 할 수 있습니다.

    0

    NULL 색인에서 값을 검색 할 수 없습니다.

    "특정 필드가 채워지지 않은 처음 10 개의 양식 선택"과 같은 쿼리를 실행해야하는 경우이 쿼리는 효율적이지 않을 수있는 FULL TABLE SCAN을 사용합니다.

    OracleNULL과 빈 문자열을 구분하지 않지만 다른 데이터베이스는 구분하지 않습니다. 채워지지 않은 필드에 대해 빈 문자열을 DEFAULT으로 만들고 검색에 사용하려고 할 것입니다.

    채워지지 않은 입력란을 검색 할 필요가없는 경우 NULL으로 설정하면됩니다.

    2

    테이블을 분할하는 경우 (옵션이 하나 이상 있습니까?) 옵션이 아닌 경우 불완전한 양식의 개체에 대한 serialization을 저장하기 위해 단일 테이블을 만들고 "실제"테이블에만 양식을 커밋하는 것이 좋습니다 양식이 사용자에 의해 완전히 제출 된 경우.

    0

    CHECK 제약 + VIEW

    당신이 상태 필드는 하나 그래서 당신이 완료되는 것을 알 수 있습니다 추가하지 않은 경우.

    • 해당 상태 필드에 점검 제한 조건을 추가하여 열이 널 (NULL) 일 경우 완료로 표시 할 수 없습니다.

    당신이 "완료"형태에 쿼리를 작성하면 사방에 널 (null)에 대한 검사를 무시할 수 있습니다 당신은이 두 가지 옵션 중 하나를 수행하는 경우 :

    • 그냥 상태를 추가 = "F"는 where 절에 inished
    • 만 완료 사람

    은 "완성보기"를 사용하여의 전망을 당신은 모든 유효성 검사를해야하거나 결과에 표시 끝나지 않은 것들에 대해 걱정하지 마십시오

    0

    NULL은 일반적으로 "알지 못함"(데이터베이스에서)을 의미하지만 빈 문자열은 실제로 빈 문자열을 나타낼 수 있습니다.

    나는 당신의 경우에 "모른다"값으로 NULL을 사용하는 경향이 있습니다. 데이터를 출력 할 때 NULL 값이 빈 문자열이라는 것을 가정해야합니다.

    +0

    반면 NULL은 뭔가를 잘 표현할 수 있습니다. EndDate라는 날짜 필드가있는 경우 null로 남겨두면 현재 프로세스의 종료 날짜가 없음을 나타냅니다. 그런 다음 NULL 값은 의미와 목적이 있습니다. – Kezzer

    1

    이 문제는 분할 된 테이블에 영향을 미칩니다. 나는 당신이 그 일을하고 싶지 않다고 말했고, 심지어 "이 프로젝트가 그 정도의 노력을 보증하지 않는다"고 말한 의견에 대해서도 말했습니다. 하지만 실제로는 최상의 솔루션입니다.

    키를 제외한 모든 항목이 예비 테이블로 설정됩니다. 사용자가 양식 완성을 표시하고 유효성 검사를 통과하면 최종 표로 이동하십시오. 이것이 올바른 일일뿐만 아니라 완성 된 양식으로 작업 할 때 "null 허용 값을 중심으로 코딩"하는 것보다 적은 노력 일 것입니다.

    모든 양식을 완료해야하는지 확인하려면 유니언 (Union)보기를 작성하십시오.

    0

    비슷한 상황이 있었지만 아직 해결 방법을 찾지 못했지만 간단한 XML 직렬화를 사용하여 임시 문서 데이터를 저장한다는 아이디어를 가지고 놀았습니다. 객체의 데이터를 모델링하는 간단한 클래스를 생성하는 경우 (필요에 따라 null 가능 유형을 사용하여) 화면의 데이터를 해당 객체에 채우고 XML로 직렬화 한 다음 임시 "스테이징" 표. 사용자가 작업을 끝내고 문서를 제출하거나 마무리하기를 원하는 경우 직렬화 된 데이터에 대해 필요한 모든 유효성 검사를 수행하여 결국 적절한 데이터 구조와 제약 조건을 가진 "실제"테이블에 넣습니다.

    관련 문제