728x90
반응형
SMALL

안녕하세요, 유튜브에서 데이터모델링를 보고 학습한 자료를 남깁니다.

 

1. DB 설계의 핵심은 '중복 없애기'

예를 들어서 사용자의 이름이 변경이 되면

게시글의 작성자는 잘못된 정보를 가지고 있게 된다.

그래서 데이터를 지우면 이런 게시글과 같은 테이블의 작성자도 전부 다 고쳐줘야 한다.

만일 게시글 테이블의 작성자 중 변경되지 못한 작성자가 있으면 사용자 테이블에서 찾을 수가 없게 된다.

이러한 문제가 발생하는 이유는 '데이터 중복' 때문이다.

실수로 중복된 데이터를 누락해서 수정을하지 않는 경우가 발생하면 데이터들 사이에 모순이 생긴다.

모순이 생기면 이상현상이 발생하게 된다. 이와 같은 이상은 갱신 이상이라고 한다. 

 

이런 문제를 해결하기 위해 만들어낸 DB 설계 방법이 정규화(Normalization)이다.

 

2. 정규화(Normalization)란?

데이터들 사이에서 발생한 모순의 근본적인 원인이 '데이터 중복'이라고 했다.

이런 문제를 해결하려면 데이터 중복을 없애면 된다. DB를 설계하면서 중복을 없애는 과정이 바로 정규화(Normalization)이다. 제1정규형, 제2정규형, 제3정규형 등 모든 정규형은 중복을 없애게 해주는 방법들이다.

 

주로 1정규형부터 3정규형까지를 실무에서 반영을 하고

BCNF, 4정규형, 5정규형을 적용시키면 지나치게 테이블이 분리되어서 관리가 복잡해지기 때문이다.

 

3. 요약

 

 

감사합니다.

https://www.youtube.com/watch?v=GyQDLUyVEFc&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=10

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 데이터모델링을 보고 학습한 자료를 남깁니다.

 

1. 기본키, 후보키, 대체키, 슈퍼키

  • 후보키의 범위 = 기본키 + 대체키
  • 기본키의 범위 = 후보키 중 대체 불가능
  • 슈퍼키의 범위 > 후보키의 범위 > 대체키의 범위 > 기본키의 범위

2. 개체-관계 모델

  • 약한 개체는 다른 개체의 존재 여부에 따라 의존적인 개체
  • 오너 개체는 다른 개체의 존재 여부를 결정하는 개체
  • 오너 개체와 약한 개체는 일반적으로 일대다의 관계를 가지고 있음
  • 약한 개체는 오너 개체의 키를 포함하여 키를 구성
  • E-R 다이어그램 (마름모: 오너개체와 약한 개체의 관계, 이중 사각형: 약한 개체)

3. 모델링 과정

요구사항 -> ERD 작성 -> 상세 속성 정의 및 정규화 -> DB 개체 정의 및 테이블, 인덱스 등 설계

 

4. 이상현상 (삭제이상, 삽입이상, 수정이상)

  • 연쇄적 삭제 이상
  • NULL값 입력 이상
  • 중복된 데이터로 일부만 수정되는 이상

 

5. 함수 종속성

  • 함수와 함수의 종속관계

 

6. 정규화

  • 도메인을 원자값으로 구성
  • 부분적 함수 종속 제거
  • 이행적 함수 종속 제거
  • 결정자이면서 후보키가 아닌 것 제거
  • 다치 종속 제거
  • 조인 종속성 이용

 

모델링의 개념적인 부분과 실제 모델링은 따로 배워야 하는 부분이 크다.

 

감사합니다.

https://www.youtube.com/watch?v=6beCydWxWWA&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=14

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 데이터모델링를 보고 학습한 자료를 남깁니다.

 

1. 데이터베이스 네이밍 규칙

1.1. 테이블명, 컬럼명을 소문자로 작성

가독성이 중요하다.

꼭 엄격히 지켜야 된다의 의미는 아니다.

일관되게 설계하기 위함이다.

대문자로 예약어를 사용하기 때문이다. 그래서 테이블명, 컬럼명은 소문자로 사용한다.

1.2. snake_case를 사용

테이블명과 컬럼명은 띄어쓰기시 snake_case로 사용한다.

firstName -> first_name

1.3. 축약어를 사용하지 않는다.

처음보는 사람도 이해할 수 있도록 직관적이어야 한다.

fst_nm -> first_name

그러나 전자정부프레임워크의 경우 축약형을 사용을 한다. (보안성)

1.4. SQL문을 작성할 때 예약어만 대문자로 표현해라.

예약어는 대문자로 표현한다.

테이블명을 지을 때 복수형 사용

꼭 그런 것 만은 아님

 

감사합니다.

https://www.youtube.com/watch?v=DbC5xFYowd4&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=9

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 데이터 모델링을 보고 학습한 자료를 남깁니다.

 

1. PK(Primary Key, 기본키)란?

PK(Primary Key, 기본키)는 특정 데이터를 식별하기 위한 값이다.

PK는 중복되어서는 안 되며, 비어서도 안 된다.

 

2. 현업에서 PK(Primary Key)는 어떻게 설정할까?

주민등록번호, 이메일은 유일한 값이지만 PK로 사용하는 것은 바람직하지 않다.

바뀔 가능성이 존재하기 때문이다.

현업에서는 PK(Primary Key)를 주로 Auto Increment(숫자가 1씩 증가하는 방식)나 UUID(랜덤값)로 설정을 많이 한다.

 

3. FK(Foreign Key, 외래키)란?

참조 테이블 입장에서 이를 FK라고 한다.

기준 테이블과 연결하기 위한 PRIMARY KEY를 저장한다.

내부 조인으로 연결한다.

적절하지 않은 FK를 입력하면 DB에서는 에러를 발생시킨다. 이를 '참조 무결성'이라고 한다. 

 

감사합니다.

https://www.youtube.com/watch?v=72Ri8KxgSp8&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=12

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 데이터 모델링을 보고 학습한 자료를 남깁니다.

 

1. 관계형 데이터베이스의 기본 구성

MySQL, MaridDB, PostgreSQL과 같은 데이터베이스를 보고 관계형 데이터베이스라고 부른다.

관계형 데이터베이스는 여러 테이블로 구성된다.

테이블은 열(컬럼, Column)과 행(로우, Row)로 구성된다.

단어들을 들었을 때 바로 알아볼 수 있어야 한다.

 

감사합니다.

https://www.youtube.com/watch?v=lr5trEm_PXA&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=4

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 데이터 모델링을 보고 학습한 자료를 남깁니다.

 

1. 데이터베이스 모델링(Database Modeling)이란?

데이터 모델링을 잘 하면, 

데이터를 검색하고, 입력/수정/삭제하기가 쉬워진다.

 

어떻게 설계할지가 데이터베이스 모델링이라고 이야기를 합니다.

 

2. 데이터베이스 모델링 방법을 왜 배워야 하나요?

옷을 정리를 잘 못하면

입고 싶을 때 해매게 된다.

데이터베이스도 마찬가지다.

데이터베이스 모델링을 위한 특정 규칙들이 있다. 이를 데이터베이스 모델링 방법이라고 한다.

데이터의 종류가 엄청 많습니다. 그래서 규칙성 없이 조금 데이터를 저장하면 찾지 못하고 헷갈리는 경우가 많다.

그래서 처음부터 분류를 잘 해야 한다.

 

감사합니다.

https://www.youtube.com/watch?v=NxQyWe2Fv_Q&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=8

 

728x90
반응형
LIST
728x90
반응형
SMALL

-- 16. 대소문자 변환 함수 배우기 (UPPER, LOWER, INITCAP)

-- 사원 테이블의 이름을 출력하는데 첫 번째 컬럼은 이름을 대문자로 출력하고 두 번째 컬럼은 이름을 소문자로 출력하고 세 번째 컬럼은 이름의 첫 번째 철자는 대문자로 하고 나머지는 소문자로 출력해 보겠습니다.

SELECT UPPER(ename), LOWER(ename), INITCAP(ename)

FROM emp;

 

-- upper함수와 lower함수는 테이블 내 특정 문자 데이터를 검색하고자 할 때 데이터가 대문자인지 소문로 저장되어 있는지 확실하지 않을 때 정확한 데이터 검색을 위해 필요합니다.

SELECT ename, sal

FROM emp

WHERE LOWER(ename) = 'scott';

 

SELECT ename, sal

FROM emp

WHERE UPPER(ename) = 'SCOTT';

 

-- 17. 문자에서 특정 철자 추출하기 (SUBSTR)

-- 영어 단어 SMITH에서 SMI만 잘라내서 출력해 보겠습니다.

SELECT SUBSTR('SMITH',1,3) -- 1번 문자를 포함해서 3개를 잘라내기

FROM DUAL;

 

SELECT SUBSTR('SMITH',-2,2) -- -2번 문자를 포함해서 2개를 잘라내기

FROM DUAL;

 

SELECT SUBSTR('SMITH',2) -- 2번 문자를 포함해서 끝까지 잘라내기

FROM DUAL;

 

-- 18. 문자열의 길이를 출력하기 (LENGTH)

-- 이름을 출력하고 그 옆에 이름의 철자 개수를 출력해 보겠습니다.

SELECT ename, LENGTH(ename)

FROM emp;

 

-- 한글도 마찬가지로 문자의 길이가 출력됩니다.

SELECT LENGTH('가나다라마')

FROM DUAL;

 

-- LENGTHB는 바이트의 길이를 반환합니다. 한글이 한글자에 3바이트이므로 15를 반환합니다.

SELECT LENGTHB('가나다라마'), LENGTHB('abcde')

FROM DUAL;

728x90
반응형
LIST
728x90
반응형
SMALL

-- 001. 테이블에서 특정 열 선택하기

-- 사원 테이블에서 사원 번호와 이름과 월급을 출력해 보겠습니다.

SELECT empno, ename, sal, deptno

FROM emp;

 

-- 002. 테이블에서 모든 열 선택하기

-- 사원 테이블을 모든 열(column)들을 전부 출력해 보겠습니다.

SELECT *

FROM emp;

 

-- 테이블의 모든 컬럼을 출력하고 맨 끝에 다시 한번 특정 컬럼을 한번 더 출력해야 하는 경우가 있습니다.

-- 이 경우 *(별표) 앞에 '테이블명.'을 붙여 주어 작성하고 그 다음 한번 더 출력하고자 하는 컬럼명을 작성합니다.

SELECT dept.*, deptno FROM dept;

 

-- 003. 컬럼 별칭을 사용하여 출력되는 컬럼명 변경하기

-- 사원 테이블의 사원 번호와 이름과 월급을 출력하는데 컬럼명을 한글로 '사원 번호', '사원 이름'으로 출력해 보겠습니다.

-- 대소문자를 구분하여 컬럼 별칭을 출력하고자 할 때는 별칭 양쪽에 더블 쿼테이션 마크를 감싸 줘야합니다.

-- 컬럼 별칭에 더블 쿼테이션 마크를 사용해야 하는 경우는 다음과 같습니다.

-- 1. 대소문자를 구분하여 출력할 때

-- 2. 공백문자를 출력할 때

-- 3. 특수문자를 출력할 때($,_,#만 가능)

SELECT empno as 사원번호, ename as 사원이름, sal as "Salary"

FROM emp;

 

-- 수식을 사용할 경우 출력되는 컬럼명도 수식으로 출력됩니다. 그런데 수식명이 아닌 한글'월급'으로 컬럼명을 출력하고 싶다면

-- 수식 뒤에 as를 작성하고 컬럼 별칭을 사용하면 됩니다.

SELECT ename, sal *(12 + 3000) as 월급

FROM emp

ORDER BY 월급 desc;

 

-- 004. 연결 연산자 사용하기(||)

-- 사원 테이블의 이름과 월급을 서로 붙여서 출력해 보겠습니다.

SELECT ename || sal

FROM emp;

 

-- 연결 연산자를 이용하면 컬럼과 컬럼을 서로 연결해서 출력할 수 있습니다.

SELECT ename || '의 월급은 ' || sal || '입니다' as 월급정보

FROM emp;

 

SELECT ename ||'의 직업은' || job || '입니다' as 직업정보

FROM emp;

 

-- 005. 주옥된 데이터를 제거해서 출력하기(DISTINCT)

-- 사원 테이블에서 직업을 출력하는데 중복된 데이터를 제외하고 출력해 보겠습니다.

SELECT DISTINCT job

FROM emp;

 

-- DISTINCT 대신 UNIQUE를 사용해도 됩니다.

SELECT UNIQUE job

FROM emp;

 

-- 006. 데이터를 정렬해서 출력하기(ORDER BY)

-- 실행순서는 다음과 같다. 1) FROM 2) SELECT 3) ORDER BY

-- 이름과 월급을 출력하는데 월급이 낮은 사원부터 출력해 보겠습니다.

SELECT ename, sal

FROM emp

ORDER BY sal asc;

 

-- ORDER BY절에는 다음과 같이 컬럼을 여러 개 작성할 수도 있습니다.

SELECT ename, sal as 월급

FROM emp

ORDER BY 월급 asc;

 

-- 부서 번호를 먼저 asceding 하게 정렬하고, 부서 번호를 ascending하게 정렬된 것을 기준으로 월급을 desceding하게 정렬하고 있습니다.

SELECT ename, deptno, sal

FROM emp

ORDER BY deptno asc, sal desc;

 

-- ORDER BY절에 컬럼명 대신 숫자를 적어줄 수도 있습니다.

SELECT ename, deptno, sal

FROM emp

ORDER BY 2 ASC, 3 DESC;

 

-- 007. WHERE절 배우기 (1 - 숫자 데이터 검색)

-- 월급이 3000인 사원들의 이름, 월급, 직업을 출력해보겠습니다.

SELECT ename, sal, job

FROM emp

WHERE sal = 3000;

 

-- 월급이 3000 이상인 사원들의 이름과 월급을 출력하는 SQL 문장을 작성하면 다음과 같습니다.

SELECT ename AS 이름, sal AS 월급

FROM emp

WHERE sal >= 3000;

 

-- 08. WHERE절 배우기 (2 - 문자와 날짜 검색)

-- 이름이 SCOTT인 사원의 이름, 월급, 직업, 입사일, 부서 번호를 출력해 보겠습니다.

SELECT ename, sal, job, hiredate, deptno

FROM emp

WHERE ename = 'SCOTT';

 

-- 81년 11월 17일에 입사한 사원의 이름과 입사일을 출력합니다.

SELECT ename, hiredate

FROM emp

WHERE hiredate = '81/11/17';

 

-- 현재 접속한 세션의 날짜 형식은 NLS_SESSION_PARAMETERS

SELECT *

FROM NLS_SESSION_PARAMETERS

WHERE PARAMETER = 'NLS_DATE_FORMAT';

 

-- ALTER SESSION명령어는 현제 내가 접속한 세션의 파라미터를 변경하는 명령어입니다.

-- 세션이란 데이터베이스 유저로 로그인해서 로그아웃할 때까지의 한 단위를 말합니다.

-- 바로 이 세션의 파라미터인 NLS_DATE_FORMAT은 현재 세션에서만 유효한 파라미터입니다. SCOTT으로 접속한 상태라면 다시 로그아웃을 했다가 접속하면 NLS_DATE_FORMAT은 RR/MM/DD인 기본값으로 복귀되어 세팅됩니다.

ALTER SESSION SET NLS_DATE_FORMAT = 'RR/MM/DD';

 

-- 09. 산술 연산자 배우기(*,/,+,-)

-- 연봉이 3600 이상인 사원들의 이름과 연봉을 출력해 보겠습니다.

SELECT ename, sal*12 AS 연봉

FROM emp

WHERE sal*12 >= 36000;

 

-- 부서 번호가 10번인 사원들의 이름, 월급, 커미션, 월급 + 커미션을 출력하는 SQL입니다.

SELECT ename, sal, comm, sal + comm

FROM emp

WHERE deptno = 10;

 

-- 커미션을 NULL이 아닌 숫자로 변경해주어야 월급 + 커미션 값이 출력될 수 있습니다.

-- NVL은 NULL 데이터를 처리하는 함수입니다.

SELECT ename, sal, comm, sal + nvl(comm, 0)

FROM emp

WHERE deptno = 10;

 

-- 10~12. 비교 연산자 배우기

-- 월급이 1200 이하인 사원들의 이름과 월급, 직업, 부서 번호를 출력해 보겠습니다.

SELECT ename, sal, job, deptno

FROM emp

WHERE sal <= 1200;

 

-- 월급이 1000에서 3000 사이인 사원들의 이름과 월급을 출력해 보겠습니다.

-- BETWEEN 하한값 AND 상한값 순으로 작성해야 검색이 됩니다.

SELECT ename, sal

FROM emp

WHERE sal BETWEEN 1000 AND 3000;

 

SELECT ename, sal

FROM emp

WHERE (sal >= 1000 AND sal <= 3000);

 

-- 다음의 쿼리는 월급이 1000에서 3000사이가 아닌 사원들의 이름과 월급을 조회합니다.

SELECT ename, sal

FROM emp

WHERE sal NOT BETWEEN 1000 AND 3000;

 

SELECT ename, sal

FROM emp

WHERE (sal < 1000 OR 3000 > sal);

 

-- 1982년도에 입사한 사원들의 이름과 입사일을 조회하는 쿼리입니다.

SELECT ename, hiredate

FROM emp

WHERE hiredate BETWEEN '82/01/01' AND '82/12/31';

 

-- 이름의 첫 글자가 S로 시작하는 사원들의 이름과 월급을 출력해 보겠습니다.

-- 와일드 카드는 이 자리에 어떠한 철자가 와도 상관없고 철자의 개수가 몇 개가 되든 관계없다는 뜻입니다.

-- %는 와일드 카드(Wild Card)라고 합니다. 이퀄 연산자(=)가 아닌 LIKE 연산자를 사용해야 합니다.

SELECT ename, sal

FROM emp

WHERE ename LIKE 'S%';

 

-- 이름의 두 번째 철자가 M인 사원의 이름을 출력합니다.

-- 언더바(_)는 어떠한 철자가 와도 관계없으나 자리수는 한 자리여야 된다는 의미입니다.

SELECT ename

FROM emp

WHERE ename LIKE '_M%';

 

-- 이름의 끝 글자가 'T'로 끝나는 사원들의 이름을 출력합니다.

SELECT ename

FROM emp

WHERE ename LIKE '%T';

 

-- 이름에 A를 포함하고 있는 사원들의 이름을 출력합니다.

SELECT ename

FROM emp

WHERE ename LIKE '%A%';

 

-- 13. 비교 연산자 배우기 (IS NULL)

-- 커미션이 NULL인 사원들의 이름과 커미션을 출력해 보겠습니다.

SELECT ename, comm

FROM emp

WHERE comm IS NULL;

 

-- 14. 비교 연산자 배우기 (IN)

-- 직업이 SALESMAN, ANALYST, MANAGER인 사원들의 이름, 월급, 직업을 출력해 보겠습니다.

SELECT ename, sal, job

FROM emp

WHERE job in ('SALESMAN', 'ANALYST', 'MANAGER');

 

SELECT ename, sal, job

FROM emp

WHERE (job = 'SALESMAN' or job ='ANALYST' or job = 'MANAGER');

 

SELECT ename, sal, job

FROM emp

WHERE job NOT in ('SALESMAN', 'ANALYST', 'MANAGER');

 

SELECT ename, sal, job

FROM emp

WHERE (job != 'SALESMAN' and job != 'ANALYST' and job != 'MANAGER');

 

-- 15. 논리 연산자 배우기 (AND, OR, NOT)

-- 직업이 SALESMAN이고 월급이 1200 이상인 사원들의 이름, 월급, 직업을 출력해 보겠습니다.

SELECT ename, sal, job

FROM emp

WHERE job = 'SALESMAN' and sal >= 1200;

728x90
반응형
LIST

+ Recent posts