2012-05-08 5 views
3

의 일부인 정규 표현식 나는 무엇보다도 직원 이름과 식별 문자열을 저장하려는 관계형 데이터베이스가 있다고 가정 해 보겠습니다. 식별 문자열의 형식은 엄격하게 정의됩니다. 세 개의 대문자, 대시, 네 자리 숫자 순으로 정의됩니다.SQL 스키마

질문 : 관계형 데이터베이스는 특정 텍스트 필드가 반드시 준수해야하는 정규 표현식을 정의 할 수 있습니까? 필자의 예와 같이, 데이터베이스가 UI 레벨에서하지 않고 간단한 정규 표현식에 대해 직원 ID의 모든 값을 검사하도록하는 것이 좋을 것이다.

또 다른 질문 : 이와 같은 문제가 발생하면 (즉, 제약 조건 집합에 대한 필드 값의 유효성 검사가 필요함) 스키마가 비정규 화되어서 수정해야한다는 의미입니까?

답변

0

두 번째 질문과 관련해서는 다릅니다. (물론 다릅니다. 항상 의존합니다.) 직원 ID 문자열을 항상 하나의 "전체"값으로 사용하면 정규화됩니다. 끊임없이 "첫 번째 및 두 번째"부분 (3 자, 4 자리)으로 나누는 경우 첫 번째 정규 양식을 위반합니다. (대략 하나의 열에 두 개의 사실이 있고 그것들을 자신의 열로 나눠야합니다.)

정상적인 정규화를 가정하면 데이터가 올바른 형식인지 확인하기 위해 데이터베이스에 의존해야한다는 사실을 염두에 두십시오 데이터 원본의 무결성에 대한 질문을 제기합니다. 데이터가 확인되고 정리되지 않고 적절하게 구성된 이유는 전에이 데이터베이스에 전달되기 전에입니까? RDBMS는 데이터를 저장, 정렬 및 검색하는 데 정말로 뛰어나지 만 복잡한 알고리즘을 처리하는 데별로 열중하지 않습니다. 그것은 그들이 원하는 것을위한 것이 아닙니다. 네가 데이터베이스에서 할 수는 있지만 그래도 할 수있는 더 좋은 방법이 있습니다.

2

예, 점검 제한 조건으로이를 수행 할 수 있습니다. 이는 벤더 사이에서 변화에 대한

  • PostgreSQL Check Constraint Supports Regular Expressions
    • 명백히지지한다. 일부 데이터베이스는 정규 표현식에 대한 지원이 제한적이거나 지원되지 않으며 일부는 점검 제한 조건을 지원하지 않습니다.

    0

    필드의 제한을 통해 확인할 수 있습니다. 그것은 당신이 사용하는 데이터베이스에 따라 다릅니다. 같은 SQL 서버에서는이 구문을 사용 할 수 있습니다.

    check (len(EmpId) = 7 and left(EmpId, 3) between 'AAA' and 'ZZZ' and 
         substring(EmpId, 4) = '-' and isnumeric(right(EmpId, 4)) = 1 
    

    첫째, 점검 제한 조건은 "CONSTRAINT 문 앞에 테이블 작성,로 전환

    둘째, 정규 표현식은 깨끗한 것 방법은 모든 데이터베이스를 지원,이 작업을 수행.하지만합니다.

    셋째, 위에서 완벽하지 않습니다. 예를 들어, 그것은 처음 세 문자 'B1B'를 할 수 있습니다. 더 복잡한 논리가 그 문제를 해결할 수 있습니다.

    마지막으로 대문자를 보장하기 위해, 비교를 위해 대/소문자를 구분하도록 데이터 정렬을 설정해야 할 수 있습니다.