From 707917684116592f4677e3a9bfc06ed658a3aca1 Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Sun, 1 Aug 2021 21:48:18 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[Java]=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=99=80=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EC=9D=98=20=EC=B0=A8=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/README.md | 4 +-- contents/language/java/appendix.md | 53 ++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 contents/language/java/appendix.md diff --git a/contents/language/README.md b/contents/language/README.md index af22812..8354979 100644 --- a/contents/language/README.md +++ b/contents/language/README.md @@ -4,9 +4,9 @@ - [자바 언어의 구조와 기본 문법](./java/1.md) - [객체지향 핵심 원리](./java/2.md) -- 자바 API 활용 +- [부록 - 생각해보기](./java/appendix.md) ## C++ - [Modern C++](./c++/moderncpp.md) -- [멀티스레드 프로그래밍](./c++/multithread-programming.md) \ No newline at end of file +- [멀티스레드 프로그래밍](./c++/multithread-programming.md) diff --git a/contents/language/java/appendix.md b/contents/language/java/appendix.md new file mode 100644 index 0000000..92315fc --- /dev/null +++ b/contents/language/java/appendix.md @@ -0,0 +1,53 @@ +# 부록 - 생각해보기 + +> 작성자 : [서그림](https://github.com/Seogeurim) + +
+Table of Contents + +- [추상클래스와 인터페이스의 차이](#추상클래스와-인터페이스의-차이) + +
+ +## 추상클래스와 인터페이스의 차이 + +Java에는 추상 클래스(`abstract`)와 인터페이스(`interface`)가 있다. 이들 각각은 무엇일까? + +#### 추상 클래스 + +상속을 통해서 자식 클래스에서 추상 메서드를 완성하도록 유도하는 클래스이다. 추상 메서드를 선언하고 선언부만 작성하면 해당 클래스를 상속받은 자식 클래스는 그 메서드를 반드시 구현해야 한다. + +```java +abstract class AbstractClass { + public abstract void AbstractMethod(); +} +``` + +#### 인터페이스 + +인터페이스는 해당 인터페이스를 구현하는 다른 클래스들에게 도움을 주는 목적으로 사용된다. 인터페이스는 추상 클래스와 다르게 다중 상속(구현)이 가능하다. + +```java +interface MyInterface { + public abstract void 메서드이름(); +} +``` + +이렇게 추상 클래스와 인터페이스가 무엇인지 정의해보았을 때 이런 의문이 들 수 있다. 명시된 메서드를 구현한다는 점에서 둘은 사용 용도가 비슷해보이는데 왜 굳이 추상 클래스와 인터페이스로 나뉘어있을까? 이 둘을 나눠서 사용하는 것에는 반드시 이유가 있다. 그 차이점에 대해 생각해보자. + +### 추상 클래스와 인터페이스의 차이점 및 사용 용도 + +#### 사용 의도의 차이 + +추상 클래스는 **상속**, 인터페이스는 **구현**해서 사용한다. 즉 이 둘은 상속과 구현이라는 점에서 그 용도가 명확히 구분된다. 상속은 `is-a` 관계를, 구현은 `can-do` 관계를 의미한다. Java에서는 하나의 클래스만 상속이 가능하기 때문에 해당 클래스의 **구분**을 추상 클래스 상속을 통해 해결하고, 할 수 있는 **기능**들을 인터페이스로 구현한다. + +#### 공통 기능 사용 여부 + +모든 클래스가 인터페이스를 사용해서 클래스 기능들을 구현한다면 공통적으로 필요한 기능들도 모든 클래스에서 재정의해야할 것이다. **공통된 기능이 필요할 때는 추상 클래스를 이용**해 일반 메서드를 작성하고, 자식 클래스에서 사용할 수 있도록 하는 것이 편할 것이다. + +#### 각각의 사용 용도 + +추상 클래스와 인터페이스는 사용 의도와 공통 기능 사용 여부에서 차이점을 가지고 있다. 둘은 각기 다른 성격을 가지고 있기 때문에 어떤 상황에서 어떤 것을 사용해야하는지 생각해보고 사용하는 것이 중요할 것이다. + +- 추상 클래스 : 부모 클래스의 기능을 이용 또는 확장하고 싶을 때 사용 +- 인터페이스 : 해당 인터페이스를 구현한 객체들에 대해 동일한 동작이 약속되어야 할 때 From 0d2392ace5da3bf7010b84f5c5d354c82c94a779 Mon Sep 17 00:00:00 2001 From: heejae Date: Thu, 5 Aug 2021 22:35:31 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[SoftwareEngineering]=20eXtreme=20Program?= =?UTF-8?q?ming=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/software-engineering/README.md | 1 + .../eXtremeProgramming.md | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 contents/software-engineering/eXtremeProgramming.md diff --git a/contents/software-engineering/README.md b/contents/software-engineering/README.md index 3211435..d5b6eda 100644 --- a/contents/software-engineering/README.md +++ b/contents/software-engineering/README.md @@ -161,6 +161,7 @@ 아래의 자료에서 자세한 설명과 코드를 볼 수 있다. - 작성자 이세명 | [Agile Software Development](./materials/CS_(Agile).pdf) +- 작성자 정희재 | [eXtreme Programming(XP)](./eXtremeProgramming.md) --- diff --git a/contents/software-engineering/eXtremeProgramming.md b/contents/software-engineering/eXtremeProgramming.md new file mode 100644 index 0000000..d9e2d6a --- /dev/null +++ b/contents/software-engineering/eXtremeProgramming.md @@ -0,0 +1,48 @@ +# eXtreme Programming (XP) + +> 작성자 : [정희재](https://github.com/Hee-Jae) + +참조 : [위키피디아](https://ko.wikipedia.org/wiki/%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%A6%BC_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) +
+Table of Contents + +- [eXtreme Programming이란?](#extreme-programming-이란) +- [다른 애자일 방법론과 구분되는 특징](#다른-애자일-방법론과-구분되는-특징) +- [XP 실천 방법](#xp-실천-방법) + +
+ +--- + +## eXtreme Programming 이란? +**익스트림 프로그래밍(eXtreme Programming, XP)** 은 `켄트 백` 등이 제안한 소프트웨어 개발 방법이다. 비즈니스 상의 요구가 시시각각 변동이 심한 경우에 적합한 개발 방법이다. 1999년 `켄트 백`의 저서인 'Extreme Programming Explained - Embrace Change'에서 발표되었다. **애자일 개발 프로세스**라 불리는 개발 방법 중의 대표적인 하나로 꼽히며, 약칭인 'XP'로 잘 알려져 있다. + +## 다른 애자일 방법론과 구분되는 특징 +1. 프로그래머들이 코딩을 할 때 **테스트 코드**도 함께 작성한다. +2. **테스트를 기반**으로 프로젝트를 완성해 나간다. +3. **반복적으로 고객에게 프로토타입을 전달**함으로써 고객의 요구사항 변화에 민첩하게 대응한다. +4. 매번 프로토타입을 고객에게 전달함에 있어서 프로토타입 자체로써 **버그가 상대적으로 적은 완벽에 가까운 데모**를 경험하게 해준다. + + +## XP 실천 방법 + +#### Whole Team +프로젝트에 참여하는 모든 팀원들을 가리킨다. 디자이너, 프로젝트 관리자, 개발자, 테스터, 유저 등 역할들이 많은데 이중 **유저가 제일 중요하다.** 유저가 프로젝트의 키를 가지고 있는 `Stakeholder`이기 때문이다. + +#### Planning Game +어떤 개발 과정을 끝마칠 것인가, 다음에는 어떤 일을 할 것인가에 중점을 두어 `iteration`을 계획한다. 일반적으로 2주를 주기로 한 `iteration`을 진행한다. 한 `iteration` 동안 프로토타입을 만들어서 의뢰인에게 보여주고 회의를 한다. 따라서 **기한 내에 프로토타입이 반드시 개발되어야 한다.** 이를 통해 기업은 본인들의 실력을 입증할 수 있고, 의뢰인 입장에서는 프로토타입이 마음에 안들 때 빠르게 손절해서 비용을 아낄 수가 있다. + +#### Customer Tests +의뢰인이 원하던 결과물을 만들어내는게 중요하다. 따라서 주기적으로 **결과물이 정말 의뢰인이 원하는 게 맞는지 테스트를 해본다.** + +#### Small Releases +**개발자는 주기적으로 의뢰인에게 프로토타입을 보여준다.** 의뢰인은 이를 통해 추가적인 요구사항을 제시할 수 있으며, 개발자는 이를 통해 현재까지 개발 상황이 올바르게 가고 있음을 알 수 있다. + +#### Simple Design +개발을 하다 보면 코드가 복잡해진다. 따라서 **코드를 가능한 심플하게 설계를 한다.** (KISS 원칙 : Keep It Small, Simple) + +#### Test-Driven Development +XP에서 가장 중요한 요소이다. **테스트를 거치면서 코딩한다.** + +#### Pair Programming +**두명 혹은 그 이상의 프로그래머가 함께 코딩을 한다.** 코딩 하는 역할, Quality Assurance 역할 등으로 나누어서 개발과 테스트에 모두 집중한다. From 5a624c0faf7f3c686f203c3ee0752c72ca9580b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EA=B0=80=EC=98=81?= Date: Sun, 8 Aug 2021 11:59:06 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[Database]=20=EC=A0=95=EA=B7=9C=ED=99=94?= =?UTF-8?q?=20=EA=B9=83=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/database/README.md | 79 +++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index a3d5d29..7c13d10 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -91,17 +91,80 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 ## 정규화 -정규화란 **종속성 이론**을 통해 데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질을 보장하고 성능의 향상해나가는 과정이다. 정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면, 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다는 특징이 있다. +정규화란 **함수의 종속성 이론**을 통해 데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질을 보장하고 성능의 향상해나가는 과정이다. 정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면, 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다는 특징이 있다 ### 정규화의 목적 -- 데이터 구조의 안정성과 무결성을 유지한다. -- 데이터 모형의 단순화가 가능하다. -- 효과적인 검색 알고리즘을 생성할 수 있다. -- 데이터 중복을 배제하여 이상(Anomaly) 발생을 방지하고 저장 공간을 최소화한다. - - 삽입 이상 (Insertion Anomaly) : 데이터를 삽입할 때 원하지 않은 값들도 함께 삽입되는 현상 - - 갱신 이상 (Update Anomaly) : 데이터를 수정할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상 - - 삭제 이상 (Deletion Anomaly) : 데이터를 삭제할 때 의도와는 상관 없는 값들도 함께 삭제되는 현상 +- 데이터 구조의 안정성과 무결성을 유지한다 +- 데이터 모형의 단순화가 가능하다 +- 효과적인 검색 알고리즘을 생성할 수 있다 +- 데이터 중복을 배제하여 `이상(Anomaly)` 발생을 방지하고 저장 공간을 최소화한다 + +### 이상(Anomaly)의 개념 및 종류 + +정규화를 거치지 않으면 **데이터베이스 내에 데이터들이 불필요하게 중복**되어 릴레이션 조작 시 문제가 생기는데, 이를 이상이라고 하며 +삽입 이상, 삭제 이상, 갱신 이상이 있다 + +- **삽입 이상** (Insertion Anomaly) : 데이터를 삽입할 때 원하지 않은 값들도 함께 삽입되는 현상 +- **갱신 이상** (Update Anomaly) : 데이터를 수정할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상 +- **삭제 이상** (Deletion Anomaly) : 데이터를 삭제할 때 의도와는 상관 없는 값들도 함께 삭제되는 현상 + +### 정규화 과정 + +#### INF(제 1 정규형) + +릴레이션에 속한 모든 도메인이 원자값만으로 되어있는 정규형이다 + +#### 2NF(제 2 정규형) + +1NF를 만족하고, 부분 함수적 종속을 제거하여 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형이다 + +```bash +완전 함수적 종속 : 만약 (속성 A, 속성 B) -> 속성 C 일때, A->C, B->C 모두 성립될때 완전 함수적 종속이라 한다 +부분 함수적 종속 : 만약 (속성 A, 속성 B) -> 속성 C 일때, A->C, B->C 중 하나만 성립될때(모두 성립 x) 부분 함수적 종속이라 한다 +``` + +#### 3NF(제 3 정규형) + +2NF를 만족하고, 이행적 함수 종속을 제거하는 정규형이다 + +```bash +이행적 종속 : A -> B, B -> C 의 종속관계에서 A -> C를 만족하는 관계를 의미한다 +``` + +#### BCNF(Boyce-Codd 정규형) + +결정자가 모두 후보키인 정규형이다.(후보키가 아닌 결정자를 제거하는 정규형이다) +
+ +[BCNF의 제약 조건] +- 키가 아닌 모든 속성은 각 키에 대하여 완전 종속해야 한다 +- 키가 아닌 모든 속성은 그 자신이 부분적으로 들어가 있지 않은 모든 키에 대해 완전 종속해야 한다 +- 어떤 속성도 키가 아닌 속성에 대해서는 완전 종속 할 수 없다 + +```bash +결정자 : 다른 속성을 고유하게 결정하는 하나 이상의 속성 (속성 간의 종속성을 규명할 때 기준이 되는 값) +종속자 : 결정자의 값에 의해 정해지는 값 +후보키 : 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합 +``` + +#### 4NF(제 4 정규형) + +다치 종속을 제거하는 정규형이다. + +```bash +다치 종속 : 속성 A -> (속성 B, 속성 C) 일때, A->B를 만족하고, **B와 C가 무관**할때 B는 A에 다치종속 관계하고 하며, A->>B 라고 한다. +``` + +#### 5NF (제 5 정규형) + +모든 조인 종속이 릴레이션의 후보키를 통해서만 성립되는 정규형이다. + +```bash +한 테이블을 분해했다가 분해된 결과들을 다시 조인하면 당연히 원래의 테이블로 복원된다고 기대하지만 그렇지 못한 경우가 있다. 다시 조인하면 예상하지 못했던 튜플들이 생성되는 경우가 발생한다. + +조인 종속 : 테이블을 분해한 결과를 다시 조인했을 때 원래의 테이블과 동일하게 복원되는 제약조건이다. 조인 종속성은 다치 종속의 개념을 더 일반화한 것이다 +``` --- From 617b48663a8a54be641d2f53de03f459c7410c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EA=B0=80=EC=98=81?= Date: Sun, 8 Aug 2021 12:03:09 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[Database]=20=EC=A0=95=EA=B7=9C=ED=99=94?= =?UTF-8?q?=20=EA=B9=83=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/database/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index 7c13d10..98f7062 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -161,11 +161,16 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 모든 조인 종속이 릴레이션의 후보키를 통해서만 성립되는 정규형이다. ```bash -한 테이블을 분해했다가 분해된 결과들을 다시 조인하면 당연히 원래의 테이블로 복원된다고 기대하지만 그렇지 못한 경우가 있다. 다시 조인하면 예상하지 못했던 튜플들이 생성되는 경우가 발생한다. +한 테이블을 분해했다가 분해된 결과들을 다시 조인하면 당연히 원래의 테이블로 복원된다고 기대하지만 그렇지 못한 경우가 있다. +다시 조인하면 예상하지 못했던 튜플들이 생성되는 경우가 발생한다. -조인 종속 : 테이블을 분해한 결과를 다시 조인했을 때 원래의 테이블과 동일하게 복원되는 제약조건이다. 조인 종속성은 다치 종속의 개념을 더 일반화한 것이다 +조인 종속 : 테이블을 분해한 결과를 다시 조인했을 때 원래의 테이블과 동일하게 복원되는 제약조건이다. ``` +### Reference + +- 2021 시나공 정보처리기사 필기 + --- ## 인덱스 (Index) From 92f055075a0265c8d58b7551331065773240fb5c Mon Sep 17 00:00:00 2001 From: KimKwon Date: Sun, 8 Aug 2021 22:46:46 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[DataStructure]=20Tree=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=ED=99=9C=EC=9A=A9=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/data-structure/basic.md | 15 ++++++ contents/data-structure/code/Tree/Tree.ts | 64 +++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 contents/data-structure/code/Tree/Tree.ts diff --git a/contents/data-structure/basic.md b/contents/data-structure/basic.md index b386e1a..3350d74 100644 --- a/contents/data-structure/basic.md +++ b/contents/data-structure/basic.md @@ -222,10 +222,25 @@ String[] name = {"Stacy", "Tracy", "Dorothy"}; ### Tree 구현 +- [List를 사용해 구현한 Tree (Typescript로 작성됨)]('./code/Tree/Tree.ts') + ### Tree 시간 복잡도 & 공간 복잡도 +- 노드 삽입: O(1) +- 노드 삭제: O(1) +- 노드 검색: O(N) + +> 노드 삭제의 경우, 언어와 구현에 따라 시간복잡도가 달라질 수 있음. +> 자바스크립트의 경우 가비지 콜렉션에 의해 참조를 삭제하는 방식으로 O(1)에 구현할 수 있음. + ### Tree 활용 +- HTML DOM 트리 +- 파일 시스템 +- DBMS +- 검색 엔진 +- 트라이 알고리즘 + --- ## Binary Tree (이진 트리) diff --git a/contents/data-structure/code/Tree/Tree.ts b/contents/data-structure/code/Tree/Tree.ts new file mode 100644 index 0000000..e700e84 --- /dev/null +++ b/contents/data-structure/code/Tree/Tree.ts @@ -0,0 +1,64 @@ +class TreeNode { + parent: TreeNode | null; + + children: TreeNode[]; + + data: any; + + level: number; + + constructor(key: any, level: number, parent: TreeNode | null) { + this.parent = parent; + this.data = key; + this.children = []; + this.level = level; + } + + addChlid(key: any): void { + this.children.push(new TreeNode(key, this.level + 1, this)); + } + + printChildNodes(): void { + this.children.forEach((e) => console.log(e.data)); + } + + getNode(key: any): TreeNode | null { + if (key === this.data) return this; + if (this.children.length === 0) return null; + + for (const child of this.children) { + const res = child.getNode(key); + if (res) return res; + } + + return null; + } + + removeNode(key: any): void { + const target = this.getNode(key); + const targetedChildren = target.parent.children; + targetedChildren.splice( + targetedChildren.findIndex((child) => child.data === key), + 1 + ); + // 삭제하고자하는 노드의 부모가 가진 자식 정보인 children 배열에서 삭제하고자하는 노드를 splice 메서드를 사용해 지움. + } +} + +const root = new TreeNode("root", 1, null); +root.addChlid("Fruit"); // key 값이 Fruit인 노드 생성 후 root의 자식으로 추가 +root.addChlid("Celebrity"); // key 값이 Celebrity인 노드 생성 후 root의 자식으로 추가 +root.addChlid("Game"); // key 값이 Game인 노드 생성 후 root의 자식으로 추가 +root.addChlid("Netflix"); // key값이 Netflix인 노드 생성 후 root의 자식으로 추가 + +root.getNode("Netflix").addChlid("Kingdom"); // Netflix 자식으로 Kingdom 추가 +root.getNode("Kingdom").addChlid("Zombie"); // Kingdom 자식으로 Zombie 추가 + +root.getNode("Celebrity").addChlid("aespa"); // Celebrity 자식으로 aespa 추가 +root.getNode("Celebrity").addChlid("psy"); // Celebrity 자식으로 psy 추가 +root.getNode("aespa").addChlid("Winter"); // aespa 자식으로 Winter 추가 + +root.getNode("Celebrity").printChildNodes(); // asepa psy +root.removeNode("aespa"); // aespa 노드를 삭제 +root.getNode("Celebrity").printChildNodes(); // psy +console.log(root.getNode("aespa")); // null From 7ebe6503c62610c2f24132c1665efac5a47240fa Mon Sep 17 00:00:00 2001 From: jjinny Date: Sun, 8 Aug 2021 22:48:03 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[DataStructure]=20Tree=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EB=8B=A4=EC=9A=B4=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/data-structure/basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contents/data-structure/basic.md b/contents/data-structure/basic.md index 3350d74..407fc46 100644 --- a/contents/data-structure/basic.md +++ b/contents/data-structure/basic.md @@ -222,7 +222,7 @@ String[] name = {"Stacy", "Tracy", "Dorothy"}; ### Tree 구현 -- [List를 사용해 구현한 Tree (Typescript로 작성됨)]('./code/Tree/Tree.ts') +- [List를 사용해 구현한 Tree (Typescript로 작성됨)](./code/Tree/Tree.ts) ### Tree 시간 복잡도 & 공간 복잡도 From 738dda7e90b9197eba88c84662ee6d90fc26c5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=EA=B0=80=EC=98=81?= Date: Fri, 13 Aug 2021 13:28:05 +0900 Subject: [PATCH 07/14] 20210813 --- contents/database/README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index 98f7062..ffa0ecc 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -91,7 +91,7 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 ## 정규화 -정규화란 **함수의 종속성 이론**을 통해 데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질을 보장하고 성능의 향상해나가는 과정이다. 정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면, 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다는 특징이 있다 +정규화란 **함수의 종속성 이론**을 통해 데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질과 성능을 향상키시는 과정이다. 정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면, 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다는 특징이 있다 ### 정규화의 목적 @@ -153,7 +153,16 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 다치 종속을 제거하는 정규형이다. ```bash -다치 종속 : 속성 A -> (속성 B, 속성 C) 일때, A->B를 만족하고, **B와 C가 무관**할때 B는 A에 다치종속 관계하고 하며, A->>B 라고 한다. +다치 종속 : 속성 A -> (속성 B, 속성 C) 일때, A->B를 만족하고, **B와 C가 무관**할때 B는 A에 다치종속 관계라고 하며, A->>B 라고 한다. + +다치종속을 제거하지 않으면 A->>B 상황에서 C값이 중복될수 있다. +예를들어, + +(회원번호)-> (이름, 주문번호) 인 테이블에서 +(회원번호 ->> 주문번호) 일때, + +흐쟈미란 고객이 책을 두번 주문하면 흐쟈미 이름이 불필요하게 두번 중복된다. +이를 해결하기 위해서는 (회원번호->이름), (회원번호->주문번호)로 쪼개주는것이 제 4정규형이다. ``` #### 5NF (제 5 정규형) From 4102ee41652e86b23e5b1b845e5b9e7c1ebf3727 Mon Sep 17 00:00:00 2001 From: KimKwon Date: Sun, 15 Aug 2021 14:42:09 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[DataStructure]=20Tree=20Suggestion=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/data-structure/code/Tree/Tree.ts | 26 +++++++++++------------ 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/contents/data-structure/code/Tree/Tree.ts b/contents/data-structure/code/Tree/Tree.ts index e700e84..72c36c7 100644 --- a/contents/data-structure/code/Tree/Tree.ts +++ b/contents/data-structure/code/Tree/Tree.ts @@ -1,28 +1,28 @@ -class TreeNode { - parent: TreeNode | null; +class TreeNode { + parent: TreeNode | null; - children: TreeNode[]; + children: TreeNode[]; - data: any; + data: DataType; level: number; - constructor(key: any, level: number, parent: TreeNode | null) { + constructor(key: DataType, level: number, parent: TreeNode | null) { this.parent = parent; this.data = key; this.children = []; this.level = level; } - addChlid(key: any): void { + addChlid(key: DataType): void { this.children.push(new TreeNode(key, this.level + 1, this)); } printChildNodes(): void { - this.children.forEach((e) => console.log(e.data)); + this.children.forEach((child) => console.log(child.data)); } - getNode(key: any): TreeNode | null { + getNode(key: DataType): TreeNode | null { if (key === this.data) return this; if (this.children.length === 0) return null; @@ -34,18 +34,16 @@ class TreeNode { return null; } - removeNode(key: any): void { + removeNode(key: DataType): void { const target = this.getNode(key); const targetedChildren = target.parent.children; - targetedChildren.splice( - targetedChildren.findIndex((child) => child.data === key), - 1 + target.parent.children = targetedChildren.filter( + (child) => child.data !== key ); - // 삭제하고자하는 노드의 부모가 가진 자식 정보인 children 배열에서 삭제하고자하는 노드를 splice 메서드를 사용해 지움. } } -const root = new TreeNode("root", 1, null); +const root = new TreeNode("root", 1, null); root.addChlid("Fruit"); // key 값이 Fruit인 노드 생성 후 root의 자식으로 추가 root.addChlid("Celebrity"); // key 값이 Celebrity인 노드 생성 후 root의 자식으로 추가 root.addChlid("Game"); // key 값이 Game인 노드 생성 후 root의 자식으로 추가 From ad3b1904fd02368d8953e483dd5bd86c31b8f5fc Mon Sep 17 00:00:00 2001 From: yoongoing Date: Sun, 15 Aug 2021 22:05:51 +0900 Subject: [PATCH 09/14] =?UTF-8?q?Database=20=EC=A0=95=EA=B7=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/database/README.md | 149 ++++++++++++++++++++++++++++-------- 1 file changed, 116 insertions(+), 33 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index b0604c9..154b372 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -91,62 +91,144 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 ## 정규화 -정규화란 **종속성 이론**을 통해 데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질을 보장하고 성능의 향상해나가는 과정이다. 정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면, 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다는 특징이 있다. +정규화란 **함수의 종속성 이론**을 통해 데이터의 중복성을 최소화하고 일관성 등을 보장하여 데이터베이스의 품질과 성능을 향상키시는 과정이다. 정규화 수준이 높을수록 유연한 데이터 구축이 가능하고 데이터의 정확성이 높아지는 반면, 물리적 접근이 복잡하고 너무 많은 조인으로 인해 조회 성능이 저하된다는 특징이 있다 ### 정규화의 목적 -- 데이터 구조의 안정성과 무결성을 유지한다. -- 데이터 모형의 단순화가 가능하다. -- 효과적인 검색 알고리즘을 생성할 수 있다. -- 데이터 중복을 배제하여 이상(Anomaly) 발생을 방지하고 저장 공간을 최소화한다. - - 삽입 이상 (Insertion Anomaly) : 데이터를 삽입할 때 원하지 않은 값들도 함께 삽입되는 현상 - - 갱신 이상 (Update Anomaly) : 데이터를 수정할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상 - - 삭제 이상 (Deletion Anomaly) : 데이터를 삭제할 때 의도와는 상관 없는 값들도 함께 삭제되는 현상 +- 데이터 구조의 안정성과 무결성을 유지한다 +- 데이터 모형의 단순화가 가능하다 +- 효과적인 검색 알고리즘을 생성할 수 있다 +- 데이터 중복을 배제하여 `이상(Anomaly)` 발생을 방지하고 저장 공간을 최소화한다 ---- +### 이상(Anomaly)의 개념 및 종류 -## 인덱스 (Index) +정규화를 거치지 않으면 **데이터베이스 내에 데이터들이 불필요하게 중복**되어 릴레이션 조작 시 문제가 생기는데, 이를 이상이라고 하며 +삽입 이상, 삭제 이상, 갱신 이상이 있다 -아래의 자료에서 자세한 설명을 볼 수 있다. +- **삽입 이상** (Insertion Anomaly) : 데이터를 삽입할 때 원하지 않은 값들도 함께 삽입되는 현상 +- **갱신 이상** (Update Anomaly) : 데이터를 수정할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상 +- **삭제 이상** (Deletion Anomaly) : 데이터를 삭제할 때 의도와는 상관 없는 값들도 함께 삭제되는 현상 -- 작성자 윤가영 | [데이터베이스와 Index](./materials/윤가영_database_&Index.pdf) +### 정규화 과정 ---- +#### 1NF(제 1 정규형) + +릴레이션에 속한 모든 도메인이 원자값만으로 되어있는 정규형이다 + +#### 2NF(제 2 정규형) + +1NF를 만족하고, 부분 함수적 종속을 제거하여 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형이다 + +```bash +완전 함수적 종속 : 만약 (속성 A, 속성 B) -> 속성 C 일때, A->C, B->C 모두 성립될때 완전 함수적 종속이라 한다 +부분 함수적 종속 : 만약 (속성 A, 속성 B) -> 속성 C 일때, A->C, B->C 중 하나만 성립될때(모두 성립 x) 부분 함수적 종속이라 한다 +``` + +#### 3NF(제 3 정규형) + +2NF를 만족하고, 이행적 함수 종속을 제거하는 정규형이다 + +```bash +이행적 종속 : A -> B, B -> C 의 종속관계에서 A -> C를 만족하는 관계를 의미한다 +``` + +#### BCNF(Boyce-Codd 정규형) + +결정자가 모두 후보키인 정규형이다.(후보키가 아닌 결정자를 제거하는 정규형이다) +
+ +[BCNF의 제약 조건] +- 키가 아닌 모든 속성은 각 키에 대하여 완전 종속해야 한다 +- 키가 아닌 모든 속성은 그 자신이 부분적으로 들어가 있지 않은 모든 키에 대해 완전 종속해야 한다 +- 어떤 속성도 키가 아닌 속성에 대해서는 완전 종속 할 수 없다 + +```bash +결정자 : 다른 속성을 고유하게 결정하는 하나 이상의 속성 (속성 간의 종속성을 규명할 때 기준이 되는 값) +종속자 : 결정자의 값에 의해 정해지는 값 +후보키 : 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합 +``` -## 트랜잭션(Transaction) +#### 4NF(제 4 정규형) -트랜잭션이란? 데이터베이스의 상태를 변화시키기 위해 수행되는 작업의 논리적 단위이다. +다치 종속을 제거하는 정규형이다. -### ACID +```bash +다치 종속 : 속성 A -> (속성 B, 속성 C) 일때, A->B를 만족하고, **B와 C가 무관**할때 B는 A에 다치종속 관계라고 하며, A->>B 라고 한다. -- Atomicity(원자성) : 트랜잭션에 해당하는 작업 내용이 (모두 성공했을 시) 모두 반영되거나, (하나라도 실패했을 시) 모두 반영되지 않아야 한다. -- Consistency(일관성) : 트랜잭션 처리 결과는 항상 데이터의 일관성을 보장해야 한다. -- Isolation(고립성) : 둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 각 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다. -- Durability(지속성) : 트랜잭션이 성공적으로 완료된다면, 그 결과가 데이터베이스에 영구적으로 반영되어야 한다. +다치종속을 제거하지 않으면 A->>B 상황에서 C값이 중복될수 있다. +예를들어, +(회원번호)-> (이름, 주문번호) 인 테이블에서 +(회원번호 ->> 주문번호) 일때, +흐쟈미란 고객이 책을 두번 주문하면 흐쟈미 이름이 불필요하게 두번 중복된다. +이를 해결하기 위해서는 (회원번호->이름), (회원번호->주문번호)로 쪼개주는것이 제 4정규형이다. +``` -주의사항 +#### 5NF (제 5 정규형) -Isolation(고립성)을 보장하기 위해 무차별적으로 Lock을 걸다보면 대기시간이 매우 길어지므로 트랜잭션은 최소한으로 사용해야한다. +릴레이션 R의 모든 조인종속이 R의 후보키를 통해서만 성립되는 정규형이다. +```bash +한 테이블을 분해했다가 분해된 결과들을 다시 조인하면 당연히 원래의 테이블로 복원된다고 기대하지만 그렇지 못한 경우가 있다. +다시 조인하면 예상하지 못했던 튜플들이 생성되는 경우가 발생한다. +조인 종속 : 테이블을 분해한 결과를 다시 조인했을 때 원래의 테이블과 동일하게 복원되는 제약조건이다. +``` +릴레이션 R이 다음과 같을때, +|A|B|C| +|------|---|---| +|s1|p1|c2| +|s1|p2|c1| +|s2|p1|c1| +|s1|p1|c1| -### 트랜잭션 상태 +[A,B], [B,C], [A,C]로 쪼개봅시다. +|A|B| +|------|---| +|s1|p1| +|s1|p2| +|s2|p1| -![image](https://user-images.githubusercontent.com/22047374/125165837-a951ee00-e1d3-11eb-9b0b-486cc5eff6b2.png) +|B|C| +|------|---| +|p1|c2| +|p2|c1| +|p1|c1| -- Active : 트랜잭션이 실행중인 상태(SQL 실행) -- Parital Commit : 트랜잭션의 마지막 연산까지 실행했지만, commit 연산이 실행되기 직전의 상태 -- Commited : 트랜잭션이 성공적으로 종료되고 commit 연산까지 실행 완료된 상태 -- Failed : 트랜잭션 실행에 오류가 발생한 상태 -- Aborted: 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태 +|A|C| +|------|--| +|s1|c2| +|s1|c1| +|s2|c1| +다시 합치면 +|A|B|C| +|------|---|---| +|s1|p1|c2| +|s1|p2|c1| +|s2|p1|c1| +|s1|p1|c1| +|s2|p1|c2| ====> 이상값 발견!!!! -1. Commit : 데이터베이스 내의 연산이 성공적으로 종료되어 연산에 의한 수정 내용을 지속적으로 유지하기 위한 명령어이다. +이런 상황을 방지하기 위해 제 5정규형을 시행합니다. -2. Rollback : 데이터베이스 내의 연산이 비정상적으로 종료되거나 정상적으로 수행이 되었다 하더라도 수행되기 이전의 상태로 되돌리기 위해 연산 내용을 취소할 때 사용하는 명령어이다. +### Reference + +- 2021 시나공 정보처리기사 필기 + +--- + +## 인덱스 (Index) + +아래의 자료에서 자세한 설명을 볼 수 있다. + +- 작성자 윤가영 | [데이터베이스와 Index](./materials/윤가영_database_&Index.pdf) + +--- + +## 트랜잭션(Transaction)과 교착상태 --- @@ -226,7 +308,7 @@ ex2) ex1에 대한 중복을 제거하기 위한 여러개의 전화번호 행

- +
제3 정규형을 '추이 종속' or '함수적 이행 종속' 단어를 사용하여 설명할 수 있나요?

@@ -245,7 +327,7 @@ ex2) ex1에 대한 중복을 제거하기 위한 여러개의 전화번호 행 반정규화는 진행하면 안됩니다. 개인정보에 관한 데이터베이스로서 데이터의 무결성과 보안이 제일 중요합니다. 만약 반정규화로 인해 '삽입, 삭제, 수정 이상'이 발생하는 경우에는 데이터의 무결성이 깨질 수 있고 더군다나 개인정보라서 데이터의 무결성이 깨지면 복원에 큰 어려움이 있습니다. 따라서 반정규화가 아닌 데이터베이스 튜닝, 재구성이 필요해 보입니다. - +

@@ -561,3 +643,4 @@ Deadlock Prevention , Avoidance 그리고 Ignorance 세가지 방법중에 실 > - Database System Concepts - 6th edition > - 시나공 정보처리기사 필기 + From 5c27213aaf32efd436d059167dc0d7e9b2d1fc87 Mon Sep 17 00:00:00 2001 From: yoongoing Date: Sun, 15 Aug 2021 22:27:15 +0900 Subject: [PATCH 10/14] Database modify --- contents/database/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contents/database/README.md b/contents/database/README.md index 154b372..594f99c 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -210,7 +210,7 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 |s1|p2|c1| |s2|p1|c1| |s1|p1|c1| -|s2|p1|c2| ====> 이상값 발견!!!! +|s2|p1|c2| ===> 이상값 발견!!!! 이런 상황을 방지하기 위해 제 5정규형을 시행합니다. From 54d95243c0c44bca051b0b22384224960804ab74 Mon Sep 17 00:00:00 2001 From: yoongoing Date: Sun, 15 Aug 2021 22:50:21 +0900 Subject: [PATCH 11/14] =?UTF-8?q?Database=20=EB=B0=98=EC=A0=95=EA=B7=9C?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/database/README.md | 80 +++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/contents/database/README.md b/contents/database/README.md index 594f99c..e20fd83 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -7,6 +7,7 @@ - [데이터베이스](#데이터베이스) - [정규화](#정규화) +- [반정규화](#반정규화) - [인덱스 (Index)](#인덱스-(index)) - [트랜잭션(Transaction)과 교착상태](#트랜잭션(transaction)과-교착상태) - [NoSQL](#nosql) @@ -220,6 +221,85 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 --- +## 반정규화 + +### 반정규화 개념 + +반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성등을 위해 정규화된 데이터모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위이다. + +* 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만, 데이터의 일관성과 정합성은 저하될 수 있다. +* 과도한 반정규화는 성능을 저하시킨다. +* 반정규화를 위해서는 사전에 **데이터의 일관성과 무결성을 우선으로 할지, 데이터베이스의 성능과 단순화를 우선**으로 할지 생각한다. +* 반정규화 방법에는 테이블 통합, 테이블 분할, 중복 데이블 추가, 중복 송성 추가 등이 있다. + + +### 테이블 통합 + +두 개의 테이블이 조인되는 경우가 많아 하나의 테이블로 합쳐 사용하는 것이 성능 향상에 도움이 될 경우 수행한다. +`두 개의 테이블에서 발생하는 프로세스가 동일하게 자주 처리되는 경우`, `두 개의 테이블을 이용하여 항상 조회를 수행하는 경우` 테이블 통합을 고려한다. + +#### 테이블 통합 시 고려사항 + +* 검색은 간편하지만, 레코드 증가로 인해 처리량이 증가한다. +* 데이블 통합으로 인해 입력, 수정, 삭제 규칙이 복잡해질 수 있다. + + +### 테이블 분할 + +테이블을 수직 또는 수평으로 분할하는 것이다. + +1. **수평 분할** : 레코드를 기준으로 테이블을 분할한다. +2. **수직 분할** : 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할한다. + 1. `갱신위주의 속성 분할` : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행 할 수 없으므로 갱신이 자주 일어나느 속성들을 수직 분할하여 사용한다. + 2. `자주 조회되는 속성 분할` : 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직분할하여 사용한다. + 3. `크기가 큰 속성 분할` : 이미지, 2GB 이상 저장될 수 있는 텍스트 형식으로 된 속성들을 수직분할하여 사용한다. + 4. `보안을 적용해야 하는 속성 분할` : 데이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할 하여 사용한다. + +#### 테이블 분할 시 고려사항 + +* 기본키의 유일성 관리가 어려워진다. +* 데이터양이 적거나 사용빈도가 낮은 경우 테이블 분할이 필요한지를 고려해야한다. +* 분할된 테이블로 인해 수행속도가 느려질 수 있다. +* 검색에 중점을 두어 테이블 분할 여부를 결정해야한다. + + +### 중복 테이블 추가 + +여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블을 추가하여 작업의 효율성을 향상시킬 수 있다. + +1. 중복 테이블을 추가하는 경우 + * 정규화로 인해 수행 속도가 느려지는 경우 + * 많은 범위의 데이터를 자주 처리해야하는 경우 + * 특정 범위의 데이터만 자주 처리해야 하는 경우 + * 처리 범위를 줄이지 않고는 수행속도를 개선할 수 없는 경우 + +2. 중복 테이블을 추가하는 방법 + 1. `집계 테이블의 추가` : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것으로, 트리거의 오버헤드에 유의한다. + 2. `진행 테이블의 추가` : 이력 관리 등의 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정한다. + 3. `특정 부분만을 포함하는 테이블의 추가` : 데이터가 많은 테이블의 특정부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다. + +### 중복 속성 추가 + +조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것이다. +> 중복 속성을 추가하면 데이터의 무결성 확보가 어렵고, 디스크 공간이 추가로 필요하다. + +1. 중복 속성을 추가하는 경우 + * 조인이 자주 발생하는 속성인 경우 + * 접근 경로가 복잡한 속성인 경우 + * 액세스 조건으로 자주 사용되는 속성인 경우 + * 기본키의 형태가 적절하지 않거나 여러 개의 속성으로 구성된 경우 + +2. 중복 속성 추가 시 고려 사항 + * 데이블 중복과 속성의 중복을 고려한다. + * 데이터 일관성 및 무결성에 유의해야 한다. + * 저장공간의 지나친 낭비를 고려한다. + +### Reference + +- 2021 시나공 정보처리기사 필기 + +--- + ## 인덱스 (Index) 아래의 자료에서 자세한 설명을 볼 수 있다. From 2bc7c9b5f195828772c51ba3caa75b6bc403727e Mon Sep 17 00:00:00 2001 From: yoongoing Date: Sun, 15 Aug 2021 22:52:31 +0900 Subject: [PATCH 12/14] =?UTF-8?q?Database=20=EB=B0=98=EC=A0=95=EA=B7=9C?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/database/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index e20fd83..ed3029a 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -250,10 +250,10 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 1. **수평 분할** : 레코드를 기준으로 테이블을 분할한다. 2. **수직 분할** : 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할한다. - 1. `갱신위주의 속성 분할` : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행 할 수 없으므로 갱신이 자주 일어나느 속성들을 수직 분할하여 사용한다. - 2. `자주 조회되는 속성 분할` : 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직분할하여 사용한다. - 3. `크기가 큰 속성 분할` : 이미지, 2GB 이상 저장될 수 있는 텍스트 형식으로 된 속성들을 수직분할하여 사용한다. - 4. `보안을 적용해야 하는 속성 분할` : 데이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할 하여 사용한다. + * `갱신위주의 속성 분할` : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행 할 수 없으므로 갱신이 자주 일어나느 속성들을 수직 분할하여 사용한다. + * `자주 조회되는 속성 분할` : 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직분할하여 사용한다. + * `크기가 큰 속성 분할` : 이미지, 2GB 이상 저장될 수 있는 텍스트 형식으로 된 속성들을 수직분할하여 사용한다. + * `보안을 적용해야 하는 속성 분할` : 데이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할 하여 사용한다. #### 테이블 분할 시 고려사항 @@ -274,9 +274,9 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 * 처리 범위를 줄이지 않고는 수행속도를 개선할 수 없는 경우 2. 중복 테이블을 추가하는 방법 - 1. `집계 테이블의 추가` : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것으로, 트리거의 오버헤드에 유의한다. - 2. `진행 테이블의 추가` : 이력 관리 등의 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정한다. - 3. `특정 부분만을 포함하는 테이블의 추가` : 데이터가 많은 테이블의 특정부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다. + * `집계 테이블의 추가` : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것으로, 트리거의 오버헤드에 유의한다. + * `진행 테이블의 추가` : 이력 관리 등의 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정한다. + * `특정 부분만을 포함하는 테이블의 추가` : 데이터가 많은 테이블의 특정부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다. ### 중복 속성 추가 From c02208fe98eaa0809da37dca8737c75cb7cb5a6b Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Sat, 4 Sep 2021 01:12:06 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[Database]=20=EC=A0=95=EA=B7=9C=ED=99=94?= =?UTF-8?q?=20=EB=B3=B4=EC=B6=A9=20=EC=84=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/database/README.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index ed3029a..ec77891 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -176,29 +176,38 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 조인 종속 : 테이블을 분해한 결과를 다시 조인했을 때 원래의 테이블과 동일하게 복원되는 제약조건이다. ``` + +
+5NF를 실시하는 이유 예시로 보기 +

+ +> "다시 조인하면 예상하지 못했던 튜플들이 생성되는 경우" + 릴레이션 R이 다음과 같을때, + |A|B|C| -|------|---|---| +|---|---|---| |s1|p1|c2| |s1|p2|c1| |s2|p1|c1| |s1|p1|c1| [A,B], [B,C], [A,C]로 쪼개봅시다. + |A|B| -|------|---| +|---|---| |s1|p1| |s1|p2| |s2|p1| |B|C| -|------|---| +|---|---| |p1|c2| |p2|c1| |p1|c1| |A|C| -|------|--| +|---|---| |s1|c2| |s1|c1| |s2|c1| @@ -206,15 +215,20 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데 다시 합치면 |A|B|C| -|------|---|---| +|---|---|---| |s1|p1|c2| |s1|p2|c1| |s2|p1|c1| |s1|p1|c1| -|s2|p1|c2| ===> 이상값 발견!!!! +|**s2**|**p1**|**c2**| + +===> 마지막 튜플에서 이상값 발견!!!! 이런 상황을 방지하기 위해 제 5정규형을 시행합니다. +

+
+ ### Reference - 2021 시나공 정보처리기사 필기 From 2b23dde5624dc5bcbeaddada3c7c547075a92d8f Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Sat, 4 Sep 2021 01:13:34 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[Database]=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EB=85=B8=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 reference 삭제 --- contents/database/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/contents/database/README.md b/contents/database/README.md index ec77891..649697d 100644 --- a/contents/database/README.md +++ b/contents/database/README.md @@ -229,10 +229,6 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데

-### Reference - -- 2021 시나공 정보처리기사 필기 - --- ## 반정규화