데이터베이스의 논리적 디자인은 매우 광범위 한 문제 이다. 이 논문에서는, 테이블의 주요 키 디자인은 MS SQL server, 디자인에서 설명 하 고 해당 솔루션을 받는다.
상태 및 기본 키 디자인의 문제
데이터베이스 테이블의 기본 키 디자인, 그것은 일반적으로 비즈니스 논리를 비즈니스 요구 사항에 따라 기본 키에 기반.
예를 들어 레코드 판매, 판매는 일반적으로 두 테이블 필요, 하나는 판매 목록, 레코드 판매 번호, 클래스의 경우 총 금액의 요약 설명, 수량 및 각 상품의 금액을 기록 하는 다른 테이블. 첫 번째 테이블 (기본 테이블)에 대 한 우리가 일반적으로 기본 키로 문서 번호 걸릴; (테이블)에서 상품 판매의 목록에 대 한 우리가으로 끼워 넣이 필요가 주요 테이블의 문서 번호는 상품의 BOM 마스터-슬레이브 관계를 상관 될 수 있도록. 문서 번호는 상품의 코드와 함께 일정의 공동 기본 키를 형성합니다. 이것은 단지 일반적인 상황, 우리는 약간이 질문을 확장: 세부 사항에, 우리의 제품의 각각 서로 다른 가격에 판매 될 수 있습니다 경우. 일부 할인 된 가격에 판매 되 고 일부는 정상 가격에서 판매. 이러한 경우를 녹음 하려면 우리가 필요 3 테이블. 이 세 번째 테이블의 기본 키 필요 합니다 첫 번째 테이블의 문서 번호와 공동 기본 키를 구성 하는 데 필요한 또는 그렇지 않으면, 첫 번째 기본 테이블 자체에서 공동 기본 키 공동 방법으로 형성 된다 정보 함께 두 번째 테이블의 상품 번호 또한 기본 키를 함께 형성 하는 테이블에서 여러 필드를 결합 해야 합니다.
데이터 중복 저장:이 마스터-슬레이브 관계의 확장, 반복적으로 데이터베이스에 저장 하는 데이터 크고 더 큰 될 것입니다. 또는 당신은 테이블에서 모든 필드를 다시 저장 해야 합니다 자체 기본 테이블에 연결 된 기본 키 이면.
SQL의 복잡도 증가: 여러 필드에 대 한 공동 기본 키 경우 특정 조건을 만족 하는 모든 세부 레코드를 자식 테이블의 여러 필드를 기본 테이블의 여러 필드를 연결에 필요 합니다.
프로그램 복잡도 증가: 여러 매개 변수 전달 되도록 할 수 있습니다.
효율 감소: 데이터베이스 시스템 더 많은 조건을 판단 하 고 SQL 문을 길이 증가. 또한, 연결 된 기본 키를 자동으로 연결 된 인덱스 생성
웹 페이징 어려움: (대부분 자식 테이블)에 대 한 페더레이션된 기본 키 이므로, 그것은 어렵다 프로세스는 웹 페이지에 매겨지는 때.
솔루션
위에서 우리는 보았다 기존 구조에 있는 결점의 상당수 비효율적이 고 페이징에 공헌 프로그램의 복잡성에 주로 발생.
위의 문제를 해결 하려면이 문서는 응용 프로그램 시스템에 테이블 사이의 마스터-슬레이브 관계 있을 때 데이터베이스 테이블 기본 키로 비즈니스 필드 추가, 필드는 숫자, 또는 때 테이블 응용 프로그램에 페이징 될 필요가 고려 한다 제안 합니다. 일반적으로, 우리는 모든 테이블의 독립적인 비즈니스 논리와 해당 테이블에 대 한 기본 키 필드는 필드를 추가할 수도 있습니다.
필드는 테이블의 기본 키를 때문에 첫 번째 조건은 테이블에 고유성을 보장 하기입니다. 동시에 SQL Server 데이터베이스의 특성을 결합 하 여 만들 수 있습니다 자동 추가 열 그것에 대 한.
다음은 참조 된 내용입니다.
만들 테이블 T_pk_demo
(
u_id BIGINT NULL ID (1, 1)가 아닌
-레코드를 고유 하 게 식별 하는 ID
Col_other VARchar NULL이
-다른 열
제약 조건 Pk_t_pk_demo 기본 키 비클러스터형
(u_id)-기본 키 정의
)
그러나, SQL Server에서 열을 자체 추가 개입 데이터베이스 시스템 자체에 의해 전적으로 제어 하는 필드의 값에는 필드를 정의 하 고 사용 되 면 사용자 수 없습니다 직접 문제는 더 당황 사실이 이다:
전체 데이터베이스 시스템 제어, 사용자 값을 수정할 수 없습니다.
게시 데이터베이스를 구독 하는 때 그것은 자체 추가 열을 사용 하 여 힘들 수 있습니다.
자가 추가 열을 사용 하 여 힘들 수 있습니다 때 일부 데이터를 복구
데이터를 검색할 수 있습니다 전에 열 값을 삽입 해야 합니다.
이 이유는 사용자 정의로 그것을 정의 하지 마십시오 하지만 대신 SQL Server 시스템에서 일련의 유사한 Oracle 데이터베이스 시스템을 구현 하는 Oracle 데이터베이스 시스템에서 시퀀스를 참조 하는 것이 좋습니다. 이 다음 섹션에서 구체적으로 설명 되어 있습니다. 우리가 해야 할 것은 일반 필드 정의를 측면에서 테이블 정의 수정:
다음은 참조 된 내용입니다.
만들 테이블 T_pk_demo
(
BIGINT u_id NULL,-고유 id 레코드의 ID
Col_other VARchar NULL이 아닌,--다른 열
기본 키를 정의 하는 제약 조건 Pk_t_pk_demo 기본 키 비클러스터형 (u_id)-
)
Oracle 시퀀스의 기능을 언급 하는, 시퀀스 값을 관리 하기 위해 SQL Server 데이터베이스에 새 테이블을 만드는 데 필요 합니다.
다음은 참조 된 내용입니다.
만들 테이블 T_db_seq
(
NULL이 아닌 Seq_namevarchar,-시퀀스 이름
Seq_owner VARchar NULL 기본값으로 사용 하지 'DBO',
-시퀀스 소유자 (SYSTEM_USER)
NULL이 아닌 Seq_current BIGINT 기본 0,-현재 값 시퀀스
Seq_min BIGINT NULL 기본 0,-시퀀스 최소
Seq_max BIGINT NULL 기본 0,-시퀀스 최소
Seq_max BIGINT NULL 기본 0,-시퀀스 최대
Seq_stepint 하지 NULL 기본 1,--시퀀스 성장 단계
If_cycleint NULL 기본 0,-여부 (0, 아니라 루프; 1, 루프) 루프
클러스터 된 기본 키 제약 조건 t_db_seq
(Seq_name, seq_owner)-기본 키
)
응용 프로그램에서는 테이블을 만들 수 필요가 시퀀스 이름을 데이터베이스에서 행으로 "T_db_seq" 테이블에 반영 됩니다.
먼저, 설정 하는 테이블에 대 한 시퀀스를 생성 해야 합니다. 방법: F_create_seq (시퀀스 이름) 함수는 시퀀스의 이름으로 전달 하 고 "T_db_seq" 테이블에 행을 삽입. 소유자는 시퀀스 시스템 변수에 SYSTEM_USER를 사용 하 여.
둘째, 다음 값을 가져옵니다. 방법: F_get_next_seq_val (시퀀스 이름) 함수는 현재 값과 성장 단계에 따라 시퀀스 이름 다음에 시퀀스의 다음 값을 가져옵니다. 동시에 함수 같은 시퀀스를 동시에 취득 하는 경우 동시 일관성을 보장 합니다.
셋째, 응용 프로그램 사용 하 여 반환 값을 반환합니다.
또한, 응용 프로그램의 무결성을 보장 하려면 필요할 수 있습니다 또한 몇 가지 다른 방법을 제공 하는 메서드 오버 로드의 몇 가지 메서드를 제공 하.
시퀀스의 현재 값을 가져오는: F_get_seq_cur_val (시퀀스 이름)
시퀀스 값 설정: F_set_seq_val (시퀀스 이름)
시퀀스 삭제: f_del_seq (시퀀스 이름)
시퀀스 있는지 확인 하려면: f_seq_exists (시퀀스 이름)
마스터-슬레이브 테이블 디자인에서 자식 테이블 또한 사용 하 여 시퀀스 필드 고유 기본 키, 외래 키와 부모 테이블의 시퀀스 필드를 연결로.
다음은 참조 된 내용입니다.
만들 테이블 T_pk_demo_c
(
BIGINT u_id NULL,-고유 id 레코드의 ID
Col_other VARchar NULL이 아닌,--다른 열
p_id INT not NULL,-부모 테이블 ID
기본 키 제약 조건 Pk_t_pk_demo_c
비클러스터형 (u_id)-기본 키를 정의 합니다.
제약 조건 fk_t_pk_demo_c 외래 키 (p_id)
삭제 캐스케이드, 참조 T_pk_demo (u_id)
)
시퀀스 및 솔루션을 사용 하 여 문제
시스템 기본 키로 추가 필드를 사용 하기 때문에 기본 키 제약 조건이 없는 비즈니스 논리에 대 한 설정 됩니다. 예를 들어 엔터프라이즈 사용자 정보 테이블에서 그것은 필요한 사용자 로그인 이름을 엔터프라이즈에서 고유 해야. 일반적으로, 테이블을 만들 때 로그인 걸작은 기본 키를 데이터베이스 계층에서 자연스럽 게 다른 기본 키 고유성 제약 조건을 만듭니다. 로그온 걸작을 기본 키로 사용 하는 대신 이러한 제약 조건이입니다. 해결 방법:
하나 데이터베이스 계층에서 해결 하는 것입니다. 독특한 (unique) 제약 조건 또는 테이블에 대 한 고유 인덱스를 만들 수 있습니다. 로:
Alter TABLE T_pk_demo 제약 조건 추가 c_t_pk_demo 고유 비클러스터형 (col_other)-Unique 제약 조건
고유 인덱스 Ix_t_pk_demo T_pk_demo (col_other)-고유 인덱스를 만들
다른 응용 프로그램에 확인 됩니다. 그것과 여부 열에 중복 값을 확인 하려면 응용 프로그램에는 다음 고유성을 보장 하는 결정의 결과에 따라.
우리는 앞의 예제에서 기본 키 했다 인덱스할 비클러스터형 (클러스터 되지 않은) 참고. 인덱스를 디자인 하는 방법에 대 한 이것은이 문서의 초점이, 여기 인덱스 작성 여부의 일반적인 원리 이다:
비 사업 분야에 대 한 기본 키 열으로 열을 중복 값이 포함 되지 않는 작업을 전혀 업데이트 하지는 않습니다 이다. 또한, SQL Server 데이터베이스에서 클러스터 된 인덱스를 하나만 테이블을 가질 수 있습니다. 따라서, 클러스터링 인덱스 매우 중요 하 고 사용 하는 더 중요 한 필드에 남아 있이 필요 합니다. 따라서, 인덱스 여기 위에 테이블 및 클러스터형된 인덱스의 중요성 달리 비클러스터형 방법으로 생성 됩니다.
특정 응용 프로그램
이 유형의 기본 키 디자인으로 이미 이전 기사에서 설명 하는 많은 이득이 있다. 이제이 기본 키를 사용 하는 방법을 설명 하는 특정 응용 프로그램을 사용 하자.
현재 응용 프로그램 시스템은 기본적으로 채택 B/s 모드, 네트워크 속도 크게 향상 되었습니다, 하지만 웹 응용 프로그램에 기본적으로 모든 사용자의 수 작업은 웹 응용 프로그램 서버에 집중 되어 있지만 성능 최적화를 고려 하는 웹 디자인에서 너무 네트워크 트래픽 및 서버에 대 한 압력을 줄이기 위해. 하나는 가장 일반적인 응용 프로그램의 목록 제시 하는 방법입니다. 일반적으로, 작은 양의 데이터의 경우 일반적으로 관심을 지불 하지,이 문제에 일반적으로 걸릴 데이터 완전히, 그리고 다음 페이징 웹 서버에서. 그러나, 데이터의 볼륨이 큰 경우,이 방법은 발생할 수 있습니다 느리거나도 사용할 수 없습니다. 그러므로, 저장된 프로시저, 데이터베이스 쪽 페이징의 일반적인 사용