AI 시대를 향유하는 AI 노마더

자바&Springboot플랫폼 과정/MariaDB

관계 데이터 모델의 컨셉과 구조

AI노마더 2023. 12. 6. 18:42

관계 데이터 모델

  • E.F. Codd가 1972년 제안한 데이터 모델
  • 실세계 데이터를 행과 열로 구성된 표 형태로 저장.
  • 한 테이블의 필드 값을 이용하여 다른 테이블에 관련된 데이터를 찾는 식으로 검색하는 데이터 모델
  • 데이터 간의 관계를 기본키와 이를 참조하는 외래키로 표현하는 데이터 모델

 

릴레이션의 구조

  • 릴레이션 (Relation)
    • 행(Row)과 열(Column)로 구성되는 테이블
    • 릴레이션 스킴(Relation Scheme)과 릴레이션 인스턴스(Relation Instance)로 구성
      • 릴레이션 스킴 : 릴레이션의 논리적 구조를 나타내며, 릴레이션 스키마라고도 함
        • <학생>(학번, 성명, 학년, 반)
      • 릴레이션 인스턴스 : 릴레이션의 실제 값들을 나타내며 릴레이션 어커런스(Occrurrence)라고도함
        • (1, 홍길동, 1, 3)
        • (2, 임꺽정, 2, 2)

 

  • 속성 (Attribute)
    • 릴레이션을 구성하는 각각의 열을 의미함
    • 개체의 특성이나 상태를 나타냄
    • 데이터베이스를 구성하는 최소논리 단위
    • 테이블의 각 열을 의미함

 

  • 튜플 (Tuple)
    • 릴레이션을 구성하는 각각의 행을 의미함
    • 속성값들의 집합으로 구성
    • 파일 구조의 레코드(Record)와 같은 의미

 

  • 관계 (Relation)
    • 개체 간의 상호 작용을 나타냄

 

  • 도메인 (Domain)
    • 하나의 속성이 취할 수 있는 같은 타입의 원자(Atomic) 값들의 집합
    • 표현되는 속성 값의 범위를 나타냄. 
      • <초등학생> 릴레이션의 학년 속성 도메인 : 1 ~ 6

 

  • 차수 (Degree)
    • 릴레이션 스키마를 구성하는 속성의 개수

 

  • 카디널리티 (Cardinality)
    • 릴레이션에 포함되어 있는 튜플의 수

 

  • 릴레이션의 특성
    • 튜플의 유일성 : 하나의 릴레이션에는 중복되는 튜플이 존재할 수 없음
    • 튜플의 무순서성 : 한 릴레이션에 포함된 튜플 사이에는 순서가 없음. 
    • 속성의 무순서성 : 속성들 간에는 순서가 없음. 
    • 속성값의 원자성 : 모든 속성값은 논리적으로 더 이상 분해할 수 없는 값이 원자값이어야함. 
    • 속성명의 유일성 : 한 릴레이션을 구성하는 속성명은 중복되어서는 안됨. (속성값은 중복 될 수 있음)

 

  • 키 (key)
    • 튜플을 유일하게 식벽할 수 있는 속성 집합.
    • 튜플을 검색하거나 정렬할 때 튜플들을 서로 구별할 수 있는 기준이 되는 속성
    • 키의 특성
      • 유일성 : 하나의 키값으로 하나의 튜플만을 식별할 수 있음. 
      • 최소성 : 키를 구성하는 속성 하나만 제외시켜도 유일성이 깨지도록 꼭 필요한 최소의 속성으로만 구성.

 

  • 키의 종류
    • 후보키 (Candidate Key)
      • 릴레이션에 있는 모든 튜플들을 유일하게 식별할 수 있는 하나 또는 몇개의 애트리뷰트 집합
    • 기본키 (Primary Key)
      • 후보키 중에서 특별히 선정된 키로 중복될 수 없음. 
      • 널(NULL) 값을 가질 수 없음.
      • 외래키에 의해 참조됨.
      • 유일성, 최소성 모두 만족함.
    • 대체키 (Alternate Key)
      • 후보키가 둘 이상 되는 경우에 그 중에서 어느 하나를 선정하여 기본키라 지정하면, 나머지 후보키들을 대체키가 됨. 
    • 슈퍼키 (Super Key)
      • 튜플을 유일하게 구별하기 위해 한 개 이상의 속성들의 집합으로 이루어진 키. 
      • 한 릴레이션에서 유일성은 만족시키지만 최소성은 만족시키지 못함. 
    • 외래키 (Foreign Key)
      • 어떤 릴레이션 R1의 기본키의 값들과 일치함을 요구하는 다른 릴레이션  R2의 한 속성을 의미. 
      • 관계 데이터 모델에서 한 릴레이션의 외래키는 참조 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는 데 사용되는 중요한 도구. 
      • 외래키로 지정되면 참조 릴레이션의 기본키에 없는 값은 입력할 수 없음. 
      • 참조무결성 제약 조건과 밀접한 관계를 가짐.
    • 무결성 (Intergrity)
      • 데이터베이스에 저장된 데이터 값과 그것이 표현하는 현실 세계의 실제 값이 일치하는 정확성을 의미
      • 데이터베이스를 정확하고 유효하게 유지 (데이터의 정확성)
      • 제약조건을 통해 무결성 유지
      • 무결성 제약(Integrity Constraint)은 데이터베이스 내에 저장되는 데이터 값들이 항상 일관성을 갖고 데이터의 유효성, 정확성, 안정성을 유지할 수 있도록 하는 제약조건을 두는 데이터베이스의 특성. 
      • 무결성 제약에는 개체 무결성 제약과 참조 무결성 제약, 도메인 무결성 제약 등이 있음. 
    • 개체 무결성 제약조건
      • 한 릴레이션의 기본키를 구성하는 어떠한 속성 값도 널(NULL)값이나 중복 값을 가질 수 없음. 
    • 도메인 무결성 제약조건
      • 주어진 속성 값이 그 속성이 정의된 도메인에 속한 값이어야 함. 
    • 참조 무결성 제약조건
      • 릴레이션 R1에 저장된 튜플이 릴레이션 R2에 있는 튜플을 참조하려면 참조되는 튜플이 반드시 R2에 존재해야한다는 데이터 무결성 규칙 (R2의 기볹키를 R1의 외래키로 참조함)
      • 릴레이션은 참조할 수 없는 외래키 값을 가질 수 있음. 
      • 외래키의 속성들은 참조하려는 테이블의 기본키와 도메인이 동일해야 함. 
      • 외래키 값은 참조하려는 테이블의 기본키 값으로 존재해야함. 

 

 

스토어드 함수 (Stored Function)

1. 스토어드 함수의 파라미터는 모두 입력 파라미터로 사용한다.

2. 스토어드 함수는 Returns문으로 반환할 값의 데이터 형식을 지정한다.

3. 본문 안에서는 Return문으로 하나의 값을 반환해야 한다. 

4. 스토어드 함수를 호출할 떄는 Select 문장으로 호출한다. 


DELIMITER $$
CREATE FUNCTION userFunc(VALUE1 INT, VALUE2 INT)
	RETURNS INT
BEGIN 
	RETURN VALUE1 + VALUE2;
END $$	
DELIMITER ; 

SELECT userFunc(10, 20) AS 합계;

 

 

 

배열 함수 

65부터 90까지 숫자를 배열로 정리하고, 그 값의 아스키코드 문자값도 구하시오!
#include <stdio.h>

int main () {
	int array [26];
	int i;
	int a; 
	
	for (i = 0; i < 26; i++){
		array[i] = 65 + i;			 
	}
	
	for (a = 0; a < 26; a++){
		int x = array [a];
		printf("array[%d] = %d = %c. \n", a, x, x);
		printf("\n");
	}
}
  • int타입의 26개의 배열을 가질수 있는 array를 선업합니다.
  • 그리고 for구문에 사용한 int 타입의 변수 i, a를 선언합니다.
  • 첫번째 for 구문에서 26동안 반복하면서 각 배열이 65~90까지 넣을 수 있도록 함수를 만듭니다.
  • 두번째 for 구문에서 각 배열과 속성값 그리고 문자형으로 변환할 수 있도록 만들었습니다.

 

 

학생들의 정보를 담은 구조체를 만들고 학생들의 국어, 영어점수 총합을 구하시오.
#include <stdio.h>
#include <string.h>

struct Student {
	int sno;
	char name[20];
	int kor_score;
	int eng_score;
};

int main (){
	struct Student member[3];
	int i;
	int k = 0;
	
	member[0].sno = 1 ;
	strcpy(member[0].name, "김성훈");
	member[0].kor_score = 80;
	member[0].eng_score = 90;
	
	member[1].sno = 2 ;
	strcpy(member[1].name, "홍길동");
	member[1].kor_score = 60;
	member[1].eng_score = 80;
	
	member[2].sno = 3 ;
	strcpy(member[2].name, "김철수");
	member[2].kor_score = 70;
	member[2].eng_score = 60;
	
	for (i = 0 ; i < 3 ; i ++) {
		printf("학생번호 : %d \n", member[i].sno);
		printf("학생이름 : %s \n", member[i].name);
		printf("국어점수 : %d \n", member[i].kor_score);
		printf("영어점수 : %d \n", member[i].eng_score);
		printf("\n");
		
		k += member[i].eng_score + member[i].kor_score; 
	}
	
	printf("---------------------\n");
	printf("학생들의 시험성적 점수의 총합은 %d입니다.\n\n", k);

	return 0;
}