-
19. 데이터 모델링 실습개발자 수업/DB 2021. 11. 17. 17:57
1. DA# Modeler5
1) (주)엔코아에서 개발 출시한 데이터 모델링 도구
2) 교육용(비상업용)은 무료, 비즈니스 도입시 라이선스 구매해야 함
3) 바커 표기법을 채택한 도구
2. 데이터 모델링 이해관계자
DBA
↓
프로젝트 개발자 → 데이터 모델링 이해/기술 ← 현업 업무 전문가
3. 데이터 모델링의 세 가지 요소
1) 어떤 것(Entity)
2) 성격(Attribute)
3) 관계(Relationship)
4. 데이터 모델링 용어
복수/집합 개념 개별/단수 개념
1) 어떤 것 엔터티 타입
엔터티 인스턴스(instance)
2) 성격 속성(Attribute) 속성값
3) 관계 관계(Relationship) 페어링(Pairing)
5. 엔터티(Entity)
1) 유형에 따른 엔터티 분류
- 유형 : 사원, 물품, 강사 (물리적인 형태가 있고 지속적으로 활용되는 엔터티)
- 개념 : 조직, 보험상품 (물리적인 형태가 존재하지 않고 개념적 정보로 구분되는 엔터티)
- 사건 : 주문, 청구, 미납 (업무를 수행함에 따라 발생되는 엔터티)
2) 발생시점에 따른 엔터티 분류
- 기본 : 사원, 부서, 고객, 상품, 자재 (원래 존재하는 정보로서 독립적으로 생성가능한 엔터티)
- 중심 : 계약, 사고, 청구, 주문, 매출 (업무에 있어서 중심적인 역할을 하는 엔터티)
- 행위 : 주문목록, 사원변경이력 (부모 엔터티로부터 발생되고 자주 내용이 바뀌거나 데이터량이 증가하는 엔터티, 상세설계단계 진행하면서 도출)
3) 엔터티는 인스턴스의 집합임
4) 엔터티의 명명
- 가능하면 현업 업무에서 사용하는 용어를 사용함
- 가능하면 약어를 사용하지 않음
- 단수 명사를 사용함
- 모든 엔터티에서 유일하게 이름이 부여되어야 함
5) 엔터티 특징
- 반드시 해당 업무에서 필요하고 관리하고자 하는 정보여야 함
- 인스턴스의 집합이어야 함
- 엔터티는 반드시 속성이 있어야 함
- 엔터티는 다른 엔터티와 최소 한 개 이상의 관계가 존재해야 함
(관계가 없는 엔터티 존재하긴 함)
6. 속성(Attribute)
1) 속성의 개념
- 업무에서 필요로 함
- 의미상 더 이상 분리되지 않음
- 엔터티를 설명하고 인스턴스의 구성요소가 됨
2) 엔터티, 인스턴스, 속성, 속성 값의 관계
- 한 개의 엔터티는 두 개 이상의 인스턴스의 집합이어야 함
- 한 개의 엔터티는 두 개 이상의 속성을 가짐
- 한 개의 속성은 한 개의 속성 값을 가짐
3) 속성의 표기법
- # : 해당 속성이 식별자임을 표시
- * : 해당 속성이 필수 값임을 표시
- ○ : 해당 속성이 선택 값임을 표시
4) 속성의 분류
- PK(primary key) : 엔터티를 식별할 수 있는 속성
- FK(foreign key) : 다른 엔터티와의 관계에서 포함된 속성
- 일반 속성 : 엔터티에 포함되어 있고 PK, FK에 포함되지 않은 속성
7. 관계 (Relationship)
1) 정의 : 상호 연관성이 있는 상태
존재의 형태로서나 행위로서 서로에게 연관성이 부여된 상태
2) 관계의 표기법
- 관계명(Membership) : 관계의 이름
- 관계차수(Cardinality) : 1:1, 1:n, m:n
- 관계선택사양(Optionality) : 필수관계, 선택관계
- 관계시작점(The Beginning) : 엔터티 관계가 시작되는 편
- 관계끝점(The End) : 엔터티 관계를 받는 편
3) 관계명의 명명 규칙
- 애매한 동사를 피함 (예: 관계된다, 관련이 있다, ~이다, ~한다)
- 현재형으로 표현 (바람직하지 않은 예: 수강을 신청했다, 강의를 할 것이다)
-> 예: 수강 신청한다, 강의를 한다
4) 관계선택사양(Optionality)
- 필수적(Mandatory) : 데이터 모델 관계에서 필수참여관계 (실선)
- 선택적(Optional) : 데이터 모델 관계에서 선택참여관계 (점선)
8. 식별자 (Identifiers)
1) 개념
- 엔터티는 인스턴스들의 집합
- 각각을 구분할 수 있는 구분자를 식별자라고 함
- 식별자는 엔터티 내에서 인스턴스를 구분할 수 있는 구분자임
- Attribute들의 조합
2) 특징
- 주 식별자(실질 식별자)에 의해 엔터티 내에 있는 모든 인스턴스들이 유일하게 구분되어야 함
- 지정된 주 식별자의 값은 변하지 않는 것이어야 함
- 주 식별자가 지정이 되면 반드시 값이 들어와야 함
DROP TABLE WDSQL.TB_DEPT purge; CREATE TABLE WDSQL.TB_DEPT( DEPT_CD char(6) NOT NULL, DEPT_NM varchar2(150) NOT NULL, UPPER_DEPT_CD char(6) ); ALTER TABLE WDSQL.TB_DEPT ADD CONSTRAINT PK_TB_DEPT PRIMARY KEY (DEPT_CD); COMMENT ON COLUMN wdsql.TB_DEPT.DEPT_CD IS '부서코드'; COMMENT ON COLUMN wdsql.TB_DEPT.DEPT_NM IS '부서이름'; COMMENT ON COLUMN wdsql.TB_DEPT.UPPER_DEPT_CD IS '상위부서코드'; INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100001', '운영본부', '999999'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100002', '지원팀', '100001'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100003', '기획팀', '100001'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100004', '디자인팀', '100001'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100005', '플랫폼사업본부', '999999'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100006', '데이터팀', '100005'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100007', '개발팀', '100005'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100008', '솔루션사업본부', '999999'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100009', '운영팀', '100008'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100010', '개발팀', '100008'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100011', '신사업본부', '999999'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100012', '인공지능팀', '100011'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('100013', '빅데이터팀', '100011'); INSERT INTO WDSQL.TB_DEPT T (T.DEPT_CD, T.DEPT_NM, T.UPPER_DEPT_CD) VALUES ('999999', '회장실', NULL); COMMIT; ------------------------------------------------------------------------------------------------------------ DROP TABLE WDSQL.TB_EMP purge; CREATE TABLE TB_EMP( EMP_NO char(10) NOT NULL, EMP_NM varchar2(150) NOT NULL, BIRTH_DE char(8) NOT NULL, LUNAR_YN char(1) NOT NULL, SEX_CD char(3) NOT NULL, ADDR varchar2(1000) NOT NULL, TEL_NO varchar2(150) NOT NULL, FINAL_EDU_SE_CD char(3) NOT NULL, SAL_TRANS_BANK_CD char(3) NOT NULL, SAL_TRANS_ACCNT_NO varchar2(20) NOT NULL, DIRECT_MANAGER_EMP_NO char(10), DEPT_CD char(6) NOT NULL ); ALTER TABLE WDSQL.TB_EMP ADD CONSTRAINT PK_TB_EMP PRIMARY KEY (EMP_NO); ALTER TABLE WDSQL.TB_EMP ADD CONSTRAINT FK_TB_EMP FOREIGN KEY (DEPT_CD) REFERENCES WDSQL.TB_DEPT (DEPT_CD); COMMENT ON COLUMN wdsql.TB_EMP.EMP_NO IS '사원번호'; COMMENT ON COLUMN wdsql.TB_EMP.EMP_NM IS '사원이름'; COMMENT ON COLUMN wdsql.TB_EMP.BIRTH_DE IS '생년월일'; COMMENT ON COLUMN wdsql.TB_EMP.LUNAR_YN IS '음력여부'; COMMENT ON COLUMN wdsql.TB_EMP.SEX_CD IS '성별코드'; COMMENT ON COLUMN wdsql.TB_EMP.ADDR IS '주소'; COMMENT ON COLUMN wdsql.TB_EMP.TEL_NO IS '전화번호'; COMMENT ON COLUMN wdsql.TB_EMP.FINAL_EDU_SE_CD IS '최종학력구분코드'; COMMENT ON COLUMN wdsql.TB_EMP.SAL_TRANS_BANK_CD IS '급여이체은행코드'; COMMENT ON COLUMN wdsql.TB_EMP.SAL_TRANS_ACCNT_NO IS '급여이체계좌번호'; COMMENT ON COLUMN wdsql.TB_EMP.DIRECT_MANAGER_EMP_NO IS '직속상사사원번호'; COMMENT ON COLUMN wdsql.TB_EMP.DEPT_CD IS '부서코드'; COMMIT; INSERT INTO WDSQL.TB_EMP T (T.EMP_NO, T.EMP_NM, T.BIRTH_DE, T.LUNAR_YN, T.SEX_CD, T.ADDR, T.TEL_NO, T.FINAL_EDU_SE_CD, T.SAL_TRANS_BANK_CD, T.SAL_TRANS_ACCNT_NO, T.DIRECT_MANAGER_EMP_NO, T.DEPT_CD) VALUES ('9999999999', '김회장', '19651105', 'N', '1', '경기도 용인시 수지구 죽전1동 215', '010-3212-7777', '006', '003', '114-125-121257', NULL, '999999'); ----------------------------------------------------------------------------------------------------------- DROP TABLE WDSQL.TB_CERTI purge; CREATE TABLE WDSQL.TB_CERTI( CERTI_CD char(15) NOT NULL, CERTI_NM varchar2(150) NOT NULL, ISSUE_INSTI_NM varchar2(150) NOT NULL ); ALTER TABLE WDSQL.TB_CERTI ADD CONSTRAINT PK_TB_CRETI PRIMARY KEY (CERTI_CD); COMMENT ON COLUMN wdsql.TB_CERTI.CERTI_CD IS '자격증코드'; COMMENT ON COLUMN wdsql.TB_CERTI.CERTI_NM IS '자격증이름'; COMMENT ON COLUMN wdsql.TB_CERTI.ISSUE_INSTI_NM IS '발행기관'; INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100001', 'SQLD', '한국데이터베이스진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100002', 'SQLP', '한국데이터베이스진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100003', 'DASP', '한국데이터베이스진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100004', 'DAP', '한국데이터베이스진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100005', 'ADSP', '한국데이터베이스진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100006', 'ADP', '한국데이터베이스진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100007', '정보처리기사', '한국산업인력공단'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100008', '리눅스마스터2급', '한국정보통신진흥협회'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100009', '리눅스마스터1급', '한국정보통신진흥협회'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100010', 'OCP', '오라클'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100011', 'OCM', '오라클'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100012', 'OCJP', '오라클'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100013', 'OCJD', '오라클'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100014', 'OCWCD', '오라클'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100015', '워드프로세서2급', '대한상공회의소'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100016', '워드프로세서1급', '대한상공회의소'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100017', '컴퓨터활용능력2급', '대한상공회의소'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100018', '컴퓨터활용능력1급', '대한상공회의소'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100019', '정보시스템감리사', '한국정보화진흥원'); INSERT INTO WDSQL.TB_CERTI T (T.CERTI_CD, T.CERTI_NM, T.ISSUE_INSTI_NM) VALUES ('100020', '정보관리기술사', '한국산업인력공단'); COMMIT; ---------------------------------------------------------------------------------------------------- DROP TABLE TB_EMP_CERTI purge; CREATE TABLE TB_EMP_CERTI ( EMP_NO char(10) NOT NULL, CERTI_SN char(3) NOT NULL, CERTI_CD char(15) NOT NULL, ACQU_DE char(8) NOT NULL ); ALTER TABLE WDSQL.TB_EMP_CERTI ADD CONSTRAINT PK_TB_EMP_CERTI PRIMARY KEY (EMP_NO, CERTI_SN); ALTER TABLE WDSQL.TB_EMP_CERTI ADD CONSTRAINT FK_TB_EMP_CERTI01 FOREIGN KEY (EMP_NO) REFERENCES wdsql.TB_EMP (EMP_NO); ALTER TABLE WDSQL.TB_EMP_CERTI ADD CONSTRAINT FK_TB_EMP_CERTI02 FOREIGN KEY (CERTI_CD) REFERENCES wdsql.TB_CERTI (CERTI_CD); COMMENT ON COLUMN wdsql.TB_EMP_CERTI.EMP_NO IS '사원번호'; COMMENT ON COLUMN wdsql.TB_EMP_CERTI.CERTI_SN IS '자격증번호'; COMMENT ON COLUMN wdsql.TB_EMP_CERTI.CERTI_CD IS '자격증코드'; COMMENT ON COLUMN wdsql.TB_EMP_CERTI.ACQU_DE IS '취득일자'; COMMENT ON TABLE WDSQL.TB_EMP_CERTI IS '사원자격증'; --------------------------------------------------------------------------------------------- DROP TABLE WDSQL.TB_SAL purge; CREATE TABLE WDSQL.TB_SAL( SAL_CD char(6) NOT NULL, SAL_NM varchar2(150) NOT NULL ); ALTER TABLE WDSQL.TB_SAL ADD CONSTRAINT PK_TB_SAL PRIMARY KEY (SAL_CD); COMMENT ON COLUMN wdsql.TB_SAL.SAL_CD IS '급여코드'; COMMENT ON COLUMN wdsql.TB_SAL.SAL_NM IS '급여명'; COMMENT ON TABLE WDSQL.TB_SAL IS '급여'; INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100001', '기본급'); INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100002', '상여금'); INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100003', '특별상여금'); INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100004', '야근수당'); INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100005', '주말수당'); INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100006', '점심식대'); INSERT INTO WDSQL.TB_SAL T (T.SAL_CD, T.SAL_NM) VALUES ('100007', '복지포인트'); COMMIT; --------------------------------------------------------------------------------- DROP TABLE TB_SAL_HIS purge; CREATE TABLE TB_SAL_HIS( SAL_HIS_NO char(15) NOT NULL, PAY_DE char(8) NOT NULL, PAY_AMT number(15) NOT NULL, EMP_NO char(10) NOT null ); ALTER TABLE WDSQL.TB_SAL_HIS ADD CONSTRAINT PK_TB_SAL_HIS PRIMARY KEY (SAL_HIS_NO); ALTER TABLE WDSQL.tb_SAL_HIS ADD CONSTRAINT FK_TB_SAL_HIS FOREIGN KEY (EMP_NO) REFERENCES Wdsql.tb_emp (EMP_NO); COMMENT ON TABLE wdsql.TB_SAL_HIS IS '급여내역'; COMMENT ON COLUMN wdsql.TB_SAL_HIS.SAL_HIS_NO IS '급여내역번호'; COMMENT ON COLUMN wdsql.TB_SAL_HIS.PAY_DE IS '지급일자'; COMMENT ON COLUMN wdsql.TB_SAL_HIS.PAY_AMT IS '지급금액'; COMMENT ON COLUMN wdsql.TB_SAL_HIS.EMP_NO IS '사원번호'; --------------------------------------------------------------------------------- DROP TABLE TB_SAL_HIS_DTL purge; CREATE TABLE TB_SAL_HIS_DTL( SAL_HIS_NO char(15) NOT NULL, DTL_SN char(3) NOT NULL, SAL_CD char(6) NOT NULL, PAY_DTL_AMT number(15) NOT NULL ); ALTER TABLE WDSQL.TB_SAL_HIS_DTL ADD CONSTRAINT PK_TB_SAL_HIS_DTL PRIMARY KEY (SAL_HIS_NO, DTL_SN); ALTER TABLE WDSQL.TB_SAL_HIS_DTL ADD CONSTRAINT FK_TB_SAL_HIS_DTL01 FOREIGN KEY (SAL_HIS_NO) REFERENCES wdsql.TB_SAL_HIS (SAL_HIS_NO); ALTER TABLE WDSQL.TB_SAL_HIS_DTL ADD CONSTRAINT FK_TB_SAL_HIS_DTL02 FOREIGN KEY (SAL_CD) REFERENCES wdsql.TB_SAL (SAL_CD); COMMENT ON TABLE WDSQL.TB_SAL_HIS_DTL IS '급여내역상세'; COMMENT ON COLUMN wdsql.TB_SAL_HIS_DTL.SAL_HIS_NO IS '급여내역번호'; COMMENT ON COLUMN wdsql.TB_SAL_HIS_DTL.DTL_SN IS '상세순번'; COMMENT ON COLUMN wdsql.TB_SAL_HIS_DTL.SAL_CD IS '급여코드'; COMMENT ON COLUMN wdsql.TB_SAL_HIS_DTL.PAY_DTL_AMT IS '지급상세금액';
'개발자 수업 > DB' 카테고리의 다른 글
18. 데이터베이스 설계2 (0) 2021.11.16 17. 논리적 설계 (0) 2021.11.16 16. 데이터베이스 설계 (0) 2021.11.16 15. SELECT (0) 2021.11.16 14. JDBCConnectTest (0) 2021.11.16