데이터베이스: 조직체의 응용 시스템들이 공유해서 사용하는 운영 데이터 들이 구조적으로 통합된 모임이다.
데이터베이스의 구조는 사용되는 데이터 모델에 의해 결정된다.
데이터베이스 관리 시스템(DBMS): 데이터베이스를 정의하고, 질의어를 지원하고, 리포트를 생성하는 등의 작 업
을 수행하는 소프트웨어
데이터베이스 스키마/ 내포(intension) : 전체적인 데이터베이스 구조를 뜻.
데이터베이스의 모든 가능한 상태를 미리 정의. 메타데이터
데이터베이스 상태/ 외연(extension) : 특정 시점의 데이터베이스의 내용을 의미하며, 계속해서 바뀜
화일시스템: 데이터가많은화일에중복해서저장됨/동시성제어X/질의어제공X/보안미흡/회복기능X/ 프로그램-데이더 독립성X / 검색, 갱신 절차 복잡 / 데이터 공유와 융통성 부족
DBMS : 중복성과 불일치가 감소 / 시스템을 개발하고 유지하는 비용이 감소 / 표준화를 시행하기가 용이 /
보안 향상/ 무결성이 향상됨 / 다양한 유형의 고장으로부터 데이터베이스를 회복/ 데베 공유와 동시접근 ( 단점: 추가적인 하드웨어 구입 비용/ DBMS 자체의 비용/ 직원들의 교육 비용/ 비밀과 프라이버시 노출 )
데이터 모델: 데이터베이스의 구조를 기술하는데 사용되는 개념들의 집합인 구조(데이터 타입과 관계), 연산자들, 무결성 제약조건들
고수준 또는 개념적 데이터 모델: 엔티티-관계(ER), 객체지향, 객체 관계 데이터 모델
표현(구현) 데이터 모델: 계층 데이터 모델, 네트워크 데이터 모델, 관계 데이터 모델
저수준 또는 물리적인 모델: ISAM, VSAM
DBMS 언어
-> 데이터 정의어(DDL): CREATE, ALTER, DROP
-> 데이터 조작어(DML): SELECT, UPDATE, DELETE, INSERT. (절차/비절차적 언어)
-> 데이터 제어어(DCL): 데이터베이스 트랜잭션을 명시하고 권한을 부여하거나 취소
DBMS 사용자
-> 데이터베이스 관리자(DBA) : 일관성 있는 데이터베이스 스키마 생성 유지
-> 응용 프로그래머: 특정 응용이나 인터페이스를 구현하는 사람. 내포된 조작어 사용. 기작성 트랜잭션(초보 사용자들이 이를 반복 수행)을 작성
-> 최종 사용자: 데이터베이스 사용하는 사람. 캐주얼 사용자& 초보 사용자
-> 데이터베이스 설계자
-> 오퍼레이터: DBMS가 운영되고 있는 컴퓨터 시스템과 전산실을 관리
ANSI/SPARC 아키텍처
-> 외부단계:각사용자의뷰
-> 개념 단계: 사용자 공동체의 뷰, 조직체 전체에 관한 스키마 포함. 데베마다 오직1개 à 내부단계:물리적또는저장뷰.인덱스,해싱등접근경로나데이터압축기술
스키마 간의 사상: 외부/개념 사상, 개념/내부 사상
논리적데이터독립성:개념스키마변화로외부스키마영향안받음
물리적 데이터 독립성: 내부 스키마 변화로 개념,외부 스키마 영향 안 받음
데이터베이스 시스템 아키텍처
데이터 정의어 컴파일러(DDL compiler) 모듈
질의 처리기(query processor) 모듈
런타임 데이터베이스 관리기(run-time database manager)
트랜잭션 관리(transaction management) : 모듈 동시성 제어 모듈, 회복 모듈
데이터베이스 API => ODBC(Open Database Connectivity) 서로 상대방의 데이터베이스를 접근
중앙 집중식 데이터베이스 시스템: 하나의 컴퓨터 시스템에서 운영됨
분산 데이터베이스 시스템: 네트워크로 연결된 여러 사이트에 데이터베이스 자체가 분산,
여러 컴퓨터 시스템에서 운영됨. 사용자는 하나인줄ᄏᄏ
클라이언트-서버 데이터베이스 시스템: 자체 컴퓨팅 능력을 가진 클라이언트를 통해 데이터베이스 서버를 접근. 데이터베이스가 하나의 데이터베이스 서버에 저장 (데베를 넓은 지역에서 접근, 보안은 좀 취약)
사용자는 원하는 데이터(what)만 명시하고, 어떻게 이 데이터를 찾을 것인가(how)는 명시할 필요가 없음
도메인(domain): 한 애트리뷰트에 나타날 수 있는 값들의 집합. 데이터 타입과 유사함.
복합 애트리뷰트나 다치 애트리뷰트는 허용되지 않음 CREATE DOMAIN DNO INTERGER
릴레이션 스키마(내포) : 릴레이션이름(애트리뷰트1, 애트리뷰트2, ... 애트리뷰트N)
릴레이션 인스턴스(외연) : 어느 시점에 들어 있는 투플들의 집합
관계 데이터베이스 스키마: 하나 이상의 릴레이션 스키마들로 이루어짐
관계 데이터베이스 인스턴스: 릴레이션 인스턴스들의 모임으로 구성됨
릴레이션 : 투플들의 집합. 동일한 투플이 두 개 이상 없음. 한 투플의 각 애트리뷰트는 원자값 가짐(한칸한값)
애트리뷰트 값의 값을 지정하거나, 지정할 수 있음
데이터 형식을 통해 값들의 유형을 제한하고, CHECK 제약 조건을 통해 값들의 범위를 제한할 수 있음
키 애트리뷰트에 값이 안됨
σ(실렉션 조건식)(R)
릴레이션 R에서 실렉션 조건식을 만족하는 투플만을 선택하여 반환
실렉션 조건을 프레디키트(predicate)라고도 함
ex)
σ중간성적<기말성적(성적)
σ이름=‘홍길동’(성적)
σ(중간성적<기말성적)AND(이름=‘홍길동’)(성적)
σ학년=4(성적)
π(애트리뷰트 리스트)(R)
애트리뷰트 값으로만 구성된 투플을 반환, 중복 있을 있음.
ex) π EMPNO, EMPNAME, TITLE(EMPLOYEE)
두 릴레이션 R1(A1, A2, ..., An)과 R2(B1, B2, ..., Bm)이 합집합 호환
일 필요 충분 조건은 , 모든 1<=i<=n에 대해 domain(Ai) = domain(Ai)
ex) π DNO(EMPLOYEE) 과 π DEPTNO(DPARTMENT)
R ∪ S
R 또는 S에 있거나 R과 S 모두에 속한 투플들로 이루어진 릴레이션, 중복 제외
ex) RESULT3 <- RESULT1 ∪ RESULT2
R ∩ S
R과 S 모두에 속한 투플들로 이
루어진 릴레이션
결과 릴레이션의 차수는 R 또는 S의 차수와 같음
ex) RESULT3 <- RESULT1 ∩ RESULT2
: 임의의 질의어가 적어도 필수적인 관계 대수 연산자들(셀렉션, 프로젝션, 합집합, 차집합, 카티션 곱) 만큼의 표현력을 갖고 있으면 관계적으로 완전하다고 말함
: 두 개의 릴레이션으로부터 연관된 투플들을 결합하는 연산자
세타 조인(theta join), 동등 조인(equijoin), 자연 조인(natural join), 외부 조인(outer join), 세미 조인(semijoin) 등
왼쪽 외부조인
오른쪽 외부조인
완전 외부 조인
SQL: 비절차적 언어(선언적 언어)이므로 사용자는 자신이 원하는 바 (what)만 명시하며, 원하는 것을 처리하는 방법(how)은 명시할 수 없음
관계 DBMS는 사용자가 입력한 SQL문을 번역하여 사용자가 요구한 데 이터를 찾는데 필요한 모든 과정을 담당
대화식 SQL(interactive SQL), 내포된 SQL(embedded SQL)
오라클 SQL의 구성요소
: 데이터 검색/ 데이터 조작어/ 데이터 정의어/ 트랜잭션 제어/ 데이터 제어어
스키마 생성과 제거
CREATE SCHEMA my_db;
DROP SCHEMA my_db;
릴레이션 정의
MySQL 숫자형 데이터타입
MySQL 문자형 데이터타입
MySQL 숫자형 데이터타입
릴레이션 제거
DROP TABLE DEPARTMENT;
애트리뷰트 추가
ALTER TABLE EMPLOYEE ADD [COLUMN] PHONE CHAR(13);
ALTER TABLE EMPLOYEE MODIFY [COLUMN] PHONE CHAR(10);
ALTER TABLE EMPLOYEE DROP [COLUMN] PHONE;
인덱스 생성 및 제거
CREATE INDEX EMPNAME_IDX ON EMPLOYEE(EMPNAME);
DROP INDEX EMPNAME_IDX ON EMPLOYEE;
참조 무결성 제약조건 유지
ON DELETE NO ACTION
ON DELETE RESTRICT
ON DELETE CASCADE -> 기본키의 삭제가 왜래키에도 파급됨
ON DELETE SET NULL -> 삭제하고 NULL 넣음. 왜래키에도 적용
ON DELETE SET DEFAULT -> (기능x)
ON UPDATE NO ACTION
ON UPDATE RESTRICT
ON UPDATE CASCADE -> 기본키 업데이트. 왜래키도 적용
ON UPDATE SET NULL -> 업데이트를 NULL함. 기본키 왜래키 모두 적용
무결성 제약조건의 추가 및 삭제
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT_PK
PRIMARY KEY (STNO);
ALTER TABLE STUDENT DROP CONSTRAINT STUDENT_PK;
ALTER TABLE STUDENT DROP FOREIGN KEY STUDENT_FK;
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT_FK FOREIGN KEY(DNO) REFERENCES DEPARTMENT(DEPTNO)
ON DELETE CASCADE;
관계 데이터베이스에서 정보를 검색하는 SQL문
관계 대수의 실렉션과 의미가 완전히 다름
관계 대수의 실렉션, 프로젝션, 조인, 카티션 곱 등을 결합한 것
관계 데이터베이스에서 가장 자주 사용됨
별칭(alias)
: 서로 다른 릴레이션에 동일한 이름을 가진 애트리뷰트가 속해 있을 때 애트리뷰트의 이름을 구분하는 방법
EMPLOYEE.DNO
FROM EMPLOYEE AS E, DEPARTMENT AS D
FROM EMPLOYEE E
릴레이션의 모든 애트리뷰트나 일부 애트리뷰트들을 검색
SELECT *
FROM DEPARTMENT;
원하는 애트리뷰트들의 이름 얻기
SELECT DEPTNO, DEPTNAME
FORM DEPARTMNET;
상이한 값들을 검색, 중복 제거
SELECT DISTINCT TITLE
FORM EMPLOYEE;
특정한 투플들의 검색
SELECT *
FROM DEPARTMENT
WHERE DNO = 2;
문자열 비교
SELECT ENPNAME, TITLE, DNO
FROM EMPLOYEE
WHERE EMPNAME LIKE '이%';
LIKE ‘S%’ => s로 시작하는 문자열
LIKE ‘J_ _ _ _’ => 5글자 중 J로 시작
LIKE ‘%x’ => x로 끝나는 문자열
LIKE '_A%’ => 1글자 + A + 임의의 문자열
다수의 검색 조건
SELECT ENPNAME, SALARY
FROM EMPLOYEE
WHERE TITLE = 'RHKWKD' AND DNO = 1;
부정 검색 조건
SELECT ENPNAME, SALARY
FROM EMPLOYEE
WHERE TITLE = 'RHKWKD' AND DNO <> 1;
범위를 사용한 검색
SELECT ENPNAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 300 AND 450;
WHERE SALARY >= 300 AND SALARY <= 450;
리스트를 사용한 검색
(1번이나 3번 부서 속한 사원 모든 정보)
SELECT *
FROM EMPLOYEE
WHERE DNO IN (1, 3);
SELECT절에서 산술 연산자 (+, -, *, /) 사용
SELECT ENPNAME, SALARY, SALARY * 1.1 AS NEWSALARY
널값
널값을 포함한 다른 값과 널값을 +, - 등을 사용하여 연산하면 결과는 널
SELECT ENPNAME, SALARY, SALARY * 1.1
FROM EMPLOYEE;
COUNT(*)를 제외한 집단 함수들은 널값을 무시함
SELECT COUNT(*), COUNT(DNO)
FROM EMPLOYEE;
어떤 애트리뷰트에 들어 있는 값이 널인가 비교하기 위해서 ‘DNO=NULL’, ‘DNO<>NULL’처럼 나타내면 안됨
SELECT *
FROM EMPLOYEE
WHERE DNO is NULL;
WHERE DNO is not NULL;
다음과 같은 비교 결과는 모두 거짓
NULL > 300, NULL = 300, NULL <> 300, NULL = NULL, NULL <> NULL
ORDER BY 절
하나 이상의 애트리뷰트를 사용하여 검색 결과를 정렬 할 수 있음 (원래 투플들이 삽입된 순서대로 사용자에게 제시됨)
SELECT문에서 가장 마지막에 사용되는 절
디폴트 정렬 순서는 (ASC)
SELECT SALARY, TITLE, EMPNAME
FROM EMPLOYEE
WHERE DNO = 2
ORDER BY SALARLY;
DESC를 지정하여 정렬 순서를 내림차순으로 지정할 수 있음
널값은 오름차순에서는 가장 앞에 나타나고, 내림차순에서는 가장 뒤에 나타남
ORDER BY DNO, SALARLY DESC;
집단 함수
한 릴레이션의 한 개의 애트리뷰트에 적용되어 단일 값을 반환함
SELECT절과 HAVING절에만 나타날 수 있음
SELECT AVG(SALARY) AS AVGSAL
FROM EMPLOYEE;
COUNT(*)를 제외하고는 널값을 제거한 후 남아 있는 값들에 대해서 집단 함수의 값을 구함
SELECT COUNT(SALARY), SUM(SALARY)
FROM EMPLOYEE;
키워드 DISTINCT가 집단 함수에 사용되면 집단 함수가 적용되기 전에 먼저 중복을 제거함
SELECT COUNT(DISTINCT DNO), SUM(DISTINCT SALARY)
FROM EMPLOYEE;
그룹화
GROUP BY절에 사용된 애트리뷰트에 동일한 값을 갖는 투플들이 각각 하 나의 그룹으로 묶임. 이 애트리뷰트를 (grouping attribute)라고 함
SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSSAL
FROM EMPLOYEE
GROUP BY DNO;
HAVING절
어떤 조건을 만족하는 그룹들에 대해서만 집단 함수를 적용할 수 있음
그룹화 애트리뷰트에 같은 값을 갖는 투플들의 그룹에 대한 조건을 나타내고, 이 조건을 만족하는 그룹들만 질의 결과에 나타남
HAVING절에 나타나는 애트리뷰트는 반드시 GROUP BY절에 나타나거나 집단 함수에 포함되어야 함
SELECT DNO, AVG(SALARY) AS AVGSAL, MAX(SALARY) AS MAXSSAL
FROM EMPLOYEE
GROUP BY DNO
HAVING DNO < 3;
집합 연산
집합 연산을 적용하려면 두 릴레이션이 합집합 호환성(두 애트리뷰트 속성 같음)을 가져야 함
UNION(합집합) => 중복 제거
UNION ALL(합집합) => 중복 포함
(SELECT DNO
FROM EMPLOYEE
WHERE EMPNAME = '김창섭';)
UNION
(SELECT DEPTNO
FROM DPARTMENT
WHERE DEPTNAME = '개발';)
조인
두 개 이상의 릴레이션으로부터 연관된 투플들을 결합
조인 조건은 두 릴레이션 사이에 속하는 애트리뷰트 값들을 비교 연산자로 연결한 것으로 가장 흔히 사용되는 비교 연산자는 =
조인 조건을 생략했을 때와 틀리게 표현했을 때는 카티션 곱이 생성됨
애트리뷰트 이름 앞에 릴레이션 이름을 사용하는 것이 바람직하며, 두 릴레이션의 조인 애트리뷰트 이름이 동일하다면 반드시 애트리뷰트 이름 앞에 릴레이션 이름을 사용해야 함
SELECT ENPNAME,DEPTNAME
FROM EMPLOYEE AS E, DEPARTMENT AS D
WHERE E.DNO = D.DEPTNO;
자체 조인(self join)
한 릴레이션에 속하는 투플을 동일한 릴레이션에 속하는 투플들과 조인하는 것.
그 릴레이션에 대한 별칭을 두 개 지정 해야 함
SELECT E.ENPNAME,M.ENPNAME
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER = M.EMPNO;
조인과 ORDER BY의 조합
SELECT DEPTNAME, ENPNAME, TITLE, SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DNO = D.DEPTNO;
ORDER BY DEPTNAME, SALARY DESC;
중첩 질의(nested query) = 부질의(subquery)
외부 질의의 WHERE절에 다시 SELECT ... FROM ... WHERE 형태로
포함된 SELECT문
INSERT,DELETE,UPDATE문에도 사용될 수 있음
1) 한개의 스칼라 값이 반환되는 경우
SELECT ENPNAME, TITLE
FROM EMPLOYEE
WHERE TITLE =
( SELECT TITLE
FROM EMPLOYEE
WHERE ENPNAME = '박영권');
2) 한 개의 애트리뷰트로 이루어진 릴레이션이 반환되는 경우
중첩 질의의 결과로 한 개의 애트리뷰트로 이루어진 다수의 투플들이 반환될 수 있음
외부 질의의 WHERE절에서 IN, ANY, ALL, EXISTS와 같은 연산자를 사용해야함
SELECT ENPNAME
FROM EMPLOYEE
WHERE DNO IN
( SELECT DEPTNO
FROM DEPARTMENT
WHERE DEPNAME = '영업' OR DEPNAME = '개발');
조인 질의로 나타내면,,,
SELECT ENPNAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DNO = D.DEPTNO
AND (D.DEPTNAME = '영업' OR D.DEPNAME = '개발');
SELECT ENPNAME, DNO
FROM EMPLOYEE
WHERE DNO < ANY
( SELECT DEPTNO
FROM DEPARTMENT
WHERE DEPNAME = '영업' OR DEPNAME = '개발');
SELECT ENPNAME, DNO
FROM EMPLOYEE
WHERE DNO <> ALL
( SELECT DEPTNO
FROM DEPARTMENT
WHERE DEPNAME = '영업' OR DEPNAME = '개발');
3) 여러 애트리뷰트들로 이루어진 릴레이션이 반환되는 경우
EXISTS 연산자를 사용하여 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사함
중첩 질의의 결과가 빈 릴레이션이 아니면 참이 되고, 그렇지 않으면 거짓
SELECT ENPNAME
FROM EMPLOYEE E
WHERE EXISTS
( SELECT *
FROM DEPARTMENT D
WHERE E.DNO = D.DEPTNO
AND ( DEPNAME = '영업' OR DEPNAME = '개발'));
SELECT ENPNAME, DNO, SALARY
FROM EMPLOYEE E
WHERE SALARY >
( SELECT AVG(SALARY)
FROM EMPLOYEE
WHERE DNO = E.DNO );
INSERT: 기존의 릴레이션에 투플을 삽입
릴레이션에 한 번에 한 투플씩 삽입하는 INSERT문
INSERT INTO DEPARTMENT
VALUES ( 5,'연구', NULL );
INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME)
VALUES ( 6,'인사');
릴레이션에 한 번에 여러 개의 투플들을 삽입하는 INSERT문
INSERT INTO HIGH_SALARY (ENAME, TITLE, SAL)
SELECT ENPNAME, TITLE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 30000;
DELETE: 한 릴레이션으로부터 한 개 이상의 투플들을 삭제함
DELETE FROM DEPARTMENT
WHERE DEPTNO = 4;
UPDATE: 한 릴레이션에 들어 있는 투플들의 애트리뷰트 값들을 수정
UPDATE EMPLOYEE
SET DNO = 3, SALARY = SALARY*1.05
WHERE EMPNO = 2016;
대부분의 데이터베이스는 저장 프로시저라는 기능을 제공
관계 데이터베이스를 위한 표준 데이터 언어인 SQL에 절차적인 언어의 기능(예를 들어, IF-THEN, WHILE 루프 등)을 추가하여 확장한 언어
MS SQL Server : 트랜잭트(Transact)-SQL
ORACLE : PL/SQL
DELIMITER $$
CREATE PROCEDURE 스토어드 프로시저이름(IN 또는 OUT 파라미터)
BEGIN
SQL프로그래밍 코딩
END $$
DELIMITER ;
CALL 스토어드 프로시저이름();
IN 입력매개변수이름 데이터형식
OUT 출력매개변수이름 데이터형식
DELIMITER $$
CREATE PROCEDURE GetEmployee (IN Name char(10), OUT Sal int)
BEGIN
SELECT salary INTO Sal
FROM EMPLOYEE
WHERE EMPNAME = Name;
END $$
DELIMITER ;
CALL GetEmployee ('김상원', @Sal);
SELECT @sal
변수 선언, IF 문
DELIMITER $$
CREATE PROCEDURE GetEmployee (IN Name char(10))
BEGIN
DECLARE VDno INT;
DECLARE vDnoavg INT;
DECLARE Salary INT;
------------------------------------------변수 선언
SELECT DO INTO VDno
FROM EMPLOYEE
WHERE EMPNAME=Name;
----------------------------------------------1
SELECT AVG(SALARY) INTO vDnoavg
FROM EMPLOYEE
WHERE DNO=vDnO;
----------------------------------------------2
SELECT SALARY INTO Salary
FROM EMPLOYEE
WHERE EMPNAME=Name;
----------------------------------------------3
IF (vSalary > VDnoavg) THEN
SELECT 평균보다 밀급이 많군요'
ELSE
SELECT '평균보다. 및급이 많지 않군요';
END IF;
----------------------------------------------if else
END $$
DELIMITER ;
: 명시된 이벤트(데이터베이스의 갱신)가 발생할 때마다 DBMS가 자동적으로 수행하는, 사용자가 정의하는 문(프로시저)
데이터베이스의 무결성을 유지하기 위한 일반적이고 강력한 도구
테이블 정의 시 표현할 수 없는 기업의 비즈니스 규칙들을 시행하는 역할
트리거를 명시하려면 트리거를 활성화시키는 사건인 이벤트(insert, delete, update),
트리거가 활성화되고 조건이 참일 때 수행되는 문(프로시저)인 동작을 표현해야 함
SQL3 표준에 포함되었으며 대부분의 상용 관계 DBMS에서 제공됨
DELIMITER //
CREATE TRIGGER testTrg
AFTER DELETE
ON EMPLOYEE
FOR EACH ROW
BEGIN
SET @msg = '직원이 삭제됨';
END //
DELIMITER ;
DELETE FROM EMPLOYEE
WHERE EMPNAME=' 김상원 ';
SELECT @msg;
삭제된 데이터 가져오기
CREATE TABLE D_NAME( DNAME CHAR(10) );
DELIMITER //
CREATE TRIGGER testTrg
AFTER DELETE
ON EMPLOYEE
FOR EACH ROW
BEGIN
INSERT INTO D_NAME VALUES(OLD.ENPNAME);
END //
DELIMITER ;
DELETE FROM EMPLOYEE
WHERE EMPNAME=' 김상원 ';
SELECT @msg;
-> 단순 애트리뷰트: 더 이상 다른 애트리뷰트로 나눌 수 없는 애트리뷰트
-> 복합 애트리뷰트: 두 개 이상의 애트리뷰트로 이루어진 애트리뷰트
-> 단일 값 애트리뷰트: 각 엔티티마다 정확하게 하나의 값을 갖는 애트리뷰트 = 단순 애트리뷰트 è다치애트리뷰트:각엔티티마다여러개의값을가질수있는애트리뷰트,취미, (이중선타원) è 저장된 애트리뷰트: 독립적으로 존재 = 단순 애트리뷰트
-> 유도된 애트리뷰트: 다른 애트리뷰트의 값으로부터 얻어진 애트리뷰트, (점선 타원)
: 관계로 연결된 엔티티 타입들의 개수. 1진/2진/3진/ n진 관계
: 한 엔티티 타입의 몇개의 엔티티가 다른 엔티티 타입의 몇개의 엔티티와 연결되어 있는가
-> 1:1
-> 1:N
-> N:N
-> 전체
-> 부분
:하나의 엔티티타입이 동일한 관계타입에 두번이상 참여하는 것...>역할표시
관계: 두 엔티티 타입 사이에 두 개 이상의 관계 타입이 존재할 수 있음
*역할: 관계 타입의 의미를 명확하게 하기 위해 사용. 특히 하나의 관계 타입에 하나의 엔티티 타입이 여 러 번 나타나는 경우에는 반드시 역할을 표기
: 내부는 참여, 외부는 카디날리티