데이터를 어떻게 사용하느냐 라는 업무 요구사항이 명확하게 되어 있어야 하고, 그 요구사항에 따라서 애플리케이션 데이터 항목을 밝혀내야 한다.
데이터 항목을 완벽하게 밝히는 것은 불가능 하기에 나중에 손쉽게 추가할 수 있는 디자인도 중요하다.
정규화를 진행 시. (책에서는 emp 테이블과 dept테이블) emp테이블에 부서 번호를 입력할 때 그 값이 dept 테이블에 있는지에 대한 여부를 자동으로 체크해준다. 만약 존재하지 않다면 오류가 반환된다.
만약 다른 서버에 있는 테이블에 대한 무결성 제약을 확ㅇ니해야 할 시 동일한 기능을 애플리케이션에서 구현하여서 확인한다.
한 row의 한 field에 대해서 여러개의 값을 넣고 싶다면? 현재의 상태로는 불가능하다.
새로운 row를 생성하는 방법?
연속적인 번호의 열 도입하기
하나의 열에 여러 부서의 정보를 등록하기
1:N 관계 두개 도입하기
제1정규형이 아닌 테이블: 테이블 구성에서 중복, 반복, 복합값 등을 포함하는 구조
제2정규형이 아닌 테이블: 기본 키가 여러 열로 구성되어 있고 그 중 일부 열의 값에 의해서만 결정되는 열이 있눈 경우.
원칙적으로 테이블의 모든 열은 기본 키 값에 따라 단 하나로 결정되어야 한다.
제3정규형이 아닌 테이블: 어떤 한 field가 결정되면 다른 field가 자동으로 결정되는 field가 있을 때, 그 field들이 분리되어 있지 않고 하나의 거대한 테이블 안에 있을 때.
CREATE TABLE EMP (
emp_id INTEGER UNSIGNED PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
emp_roman VARCHAR(50) NOT NULL,
emp_email VARCHAR(100) NOT NULL,
INDEX(emp_roman)
PRIMARY KEY (emp_id)
);
CREATE TABLE dept(
dept_id SMALLINT UNSIGNED PRIMARY KEY,
dept_name VARCHAR(50) NOT NULL,
dept_tel VARCHAR(20) NOT NULL
PRIMARY KEY (dept_id)
);
CREATE TABLE emp_dept (
emp_id INTEGER UNSIGNED,
dept_id SMALLINT UNSIGNED,
PRIMARY KEY (emp_id, dept_id)
);
INSERT INTO emp (emp_id, emp_roman, emp_name, emp_email) VALUES(1, 'Mitsuru', '미쯔루', 'mitsuru@ex.com');
INSERT INTO emp (emp_id, emp_roman, emp_name, emp_email) VALUES(내용), (내용);
인덱스를 사용할 수 없는 조건으로 검색하게 되면 'emp 전체 레코드를 읽고 조건 값과 일치하는 레코드만을 돌려주는' 처리를 하게 된다.
이는 테이블이 큰 경우 매우 무거운 처리이다. (DB상의 효율이 나쁜 처리는 보통 나쁜 SELECT문에 의해서 발생한다!)
UPDATE emp_dept SET dept_id=101 WHERE emp_id=1 AND dept_id=100;
DELETE FROM emp WHERE emp_id=1;
RDMBS에서는 TRUNCATE TABLE이라는 고속의 제거 방법을 제공하므로 이를 사용하면 좋다.
TRUNCATE TABLE emp;
SELECT emp.emp_email, dept.dept_name
FROM emp, dept, emp_dept
WHERE emp_roman LIKE 'Chie%' AND emp.emp_id = emp_dept.emp_id
AND emp_dept.dept_id=dept.dept_id;
애플리케이션은 데이터베이스 서버와는 다른 컴퓨터에서 작동한다. JOIN을 통해서 여러 SQL문을 하나의 SQL문으로 합치자.
분산 데이터베이스 환경과 조인 궁합
인덱스를 전혀 사용할 수 없는 경우 테이블 전체의 레코드를 검색해야만 결과 일치 여부를 판정할 수 있다. (테이블이 거대한 경우 이 작업은 매우 무거워진다)
SQL문의 실행 방식이 적잘하지 여부를 실제로 실행하지 않고 판정만 해주는 기능.
이 때 rows의 값은 실제로 DB 레코드에 엑세스되는 횟수가 된다(추정치)