🤔정규화(Normalization) 란?

Normalization : "중복을 제거하며, 일관성을 개선하는 Process"

< 정규화 하는 이유 >

⒧.데이터의 수정(삽입, 삭제, 갱신) 이상현상을 제거하기 위해

⑵.데이터 중복을 최소화 하기 위함

🌳정규화의 단계 

 

< 제1정규형 (1NF) >

모든 행이 같은 수의 열을 가져야 하고, 각 열의 값이 더 이상 분할할 수 없는 원자적 값이어야 한다. 예를 들어, 학생이 수강하는 과목을 하나의 열로 표현한다고 한다면.

이 열에 'Math, Science'와 같이 여러 과목을 쉼표로 구분하여 넣는다면, 이는 1NF를 위반하는 것이다. 왜냐하면 '수학, 과학'은 더 이상 분할할 수 있는 값이기 때문이다. 1NF를 만족시키려면, 각 과목을 별도의 행으로 분리해야 한다.

CREATE TABLE Students (
StudentID INT,
NAME VARCHAR(100),
Subjects VARCHAR(100)
);

Insert INTO Students VALUES (1, 'Jone Doe', 'Math, Science');
Insert INTO Students VALUES (2, 'Jane Doe', 'Math, English');

위의 Students Table은 1NF를 위반하는 Table이다.  Subjects에 'Math, English'  이렇게 여러 과목을 Insert하여 원자성을 위반 하기 때문이다.

 

1NF를 위반하고 있는 Student Table을 만족하는 코드는 아래와 같다.  

CREATE TABLE Students (
 StudentID INT,
 Name VARCHAR(100)
 );
 
 CREATE TABLE StudentSubjects (
 StudentID INT,
 Subject VARCHAR(100)
 );
 
 INSERT INTO Students VALUES (1, 'John Doe');
 INSERT INTO StudentSubjects VALUES (1, 'Math');
 INSERT INTO StudentSubjects VALUES (1, 'Science');
 
 INSERT INTO Students VALUES (2, 'Jane Doe');
 INSERT INTO StudentSubjects VALUES (2, 'Math');
 INSERT INTO StudentSubjects VALUES (2, 'English');

이 경우, 'Students' Table은 학생 정보만을, 'StudentSubjects'테이블은 학생이 수강하는 과목 정보를 각각 저장하고 있다.이는 각 컬럼의 값이 원자적이라는 1NF의 원칙을 만족하는 것이다.

 

이를 테이블로 표현하면 다음과 같다.

< Students Table >

StudentID Name
1 John Doe
2 Jane Doe

 < StudentSubjects Table >

StudentID Subject
1 Math
1 Science
2 Math
2 English

< 제2정규형 (2NF) >

2NF는 1NF를 만족하는 테이블에 대해 추가적인 규칙을 제공한다. 2NF를 만족하려면, 테이블의 모든 기본 키가 아닌 열이 기본 키에 완전히 종속되어야 한다. 이는 "부분적 종속성"이 없어야 한다는 것을 의미한다.

부분적 종속성이란, 복합 키(두 개 이상의 열로 구성된 키)의 일부에만 종속되는 열이 존재하는 상황을 말한다.

예를 들어, 학생이 수강하는 과목에 대한 정보를 기록하는 테이블이 있다고 가정해 보자. 이 테이블의 기본 키는 '학번'과 '과목명'으로 구성되어 있다. 이때 '교수명'이라는 열이 '과목명'에만 종속되어 있다면, 이는 2NF를 위반하는 것이다. 왜냐하면 '교수명'은 기본 키의 일부인 '과목명'에만 종속되기 때문이다. 이 경우, 과목에 대한 정보가 여러 곳에 중복되어 저장될 수 있다.

CREATE TABLE StudentCourses (
StudentID INT,
CourseName VARCHAR(100),
ProfessorName VARCHAR(100)
);

INSERT INTO StudentCourses VALUES (1, 'Math', 'Professor A');
INSERT INTO StudentCourses VALUES (1, 'Science', 'Professor B');
INSERT INTO StudentCourses VALUES (2, 'Math', 'Professor A');

위의 코드에서 'ProfessorName'열은 'CourseName'에만 종속되어 있다. 이는 2NF를 위반하는 것이다.

 

2NF를 만족하는 코드는 아래와 같다.

CREATE TABLE Students (
    StudentID INT,
    Name VARCHAR(100)
);

CREATE TABLE Courses (
    CourseName VARCHAR(100),
    ProfessorName VARCHAR(100)
);

CREATE TABLE StudentCourses (
    StudentID INT,
    CourseName VARCHAR(100)
);

INSERT INTO Students VALUES (1, 'John Doe');
INSERT INTO Courses VALUES ('Math', 'Professor A');
INSERT INTO Courses VALUES ('Science', 'Professor B');
INSERT INTO StudentCourses VALUES (1, 'Math');
INSERT INTO StudentCourses VALUES (1, 'Science');
INSERT INTO StudentCourses VALUES (2, 'Math');

위의 코드에서 'Students' 테이블은 학생 정보만을, 'Courses' 테이블은 강좌와 강좌를 담당하는 교수의 정보를, 'StudentCourses' 테이블은 학생이 수강하는 강좌의 정보를 각각 저장하고 있다. 이는 각 열이 기본 키에 완전히 종속되어 있으므로 2NF를 만족한다.

 

 

이를 테이블로 표현하면 다음과 같다. 

      < Students Table >

StudentID Name
1 John Doe

                                                                         < Courses Table >

CourseName ProfessorName
Math Professor A
Science Professor B

< StudentCourses Table >

StudentID CourseName
1 Math
1 Science
2 Math

 


< 제3정규형 (3NF) >

3NF는 Table이 2NF를 만족하면서 추가로 '이행적 종속성'이 없어야 함을 요구한다. 이행적 종속성이란, A가 B에 종속되고 B가 C에 종속될 때, A가 C에 간접적으로 종속되는 관계를 말한다. 3NF는 이러한 이행적 종속성을 허용하지 않는다.

예를 들어, 학번(StudentID), 과목명(CourseName), 교수명(ProfessorName)이라는 열이 있는 테이블에서 '과목명'이 '교수명'에 종속되고, '학번'이 '과목명'에 종속되는 경우, '학번'은 '교수명'에 이행적 종속성을 가진다고 할 수 있다. 이는 3NF를 위반하는 것이다. 이행적 종속성을 제거하려면, '교수명'을 별도의 테이블로 분리하고, 이 테이블의 기본 키를 '과목명'으로 설정해야 한다.

CREATE TABLE StudentCourses (
    StudentID INT,
    CourseName VARCHAR(100),
    ProfessorName VARCHAR(100)
);

INSERT INTO StudentCourses VALUES (1, 'Math', 'Professor A');
INSERT INTO StudentCourses VALUES (1, 'Science', 'Professor B');
INSERT INTO StudentCourses VALUES (2, 'Math', 'Professor A');

 

위의 코드는 3NF를 위반하는 코드 예시이다.  위의 코드에서 'ProfessorName' 열은 'CourseName'에 종속되어 있으며, 'StudentID' 열은 'CourseName'에 종속되어 있다. 따라서 'StudentID'는 'ProfessorName'에 이행적 종속성을 가지며, 이는 3NF를 위반하는 것이다.

 

3NF를 만족하는 코드는 아래와 같다.

CREATE TABLE Students (
    StudentID INT,
    Name VARCHAR(100)
);

CREATE TABLE Courses (
    CourseName VARCHAR(100),
    ProfessorName VARCHAR(100)
);

CREATE TABLE StudentCourses (
    StudentID INT,
    CourseName VARCHAR(100)
);

INSERT INTO Students VALUES (1, 'John Doe');
INSERT INTO Courses VALUES ('Math', 'Professor A');
INSERT INTO Courses VALUES ('Science', 'Professor B');
INSERT INTO StudentCourses VALUES (1, 'Math');
INSERT INTO StudentCourses VALUES (1, 'Science');
INSERT INTO StudentCourses VALUES (2, 'Math');

위의 코드에서 'Students' 테이블은 학생 정보만을, 'Courses' 테이블은 강좌와 강좌를 담당하는 교수의 정보를, 'StudentCourses' 테이블은 학생이 수강하는 강좌의 정보를 각각 저장하고 있다. 이는 각 열이 기본 키에 완전히 종속되어 있으며 이행적 종속성이 없음을 의미하므로, 3NF를 만족한다. 이와 같이 3NF를 만족하는 설계는 데이터의 중복을 최소화하고 무결성을 보장한다.

 

이를 테이블로 표현하면 다음과 같다. 

< Students Table >

StudentID Name
1 John Doe

< Courses Table >

CourseName ProfessorName
Math Professor A
Science Professor B

< StudentCourses Table > 

StudentID CourseName
1 Math
1 Science
2 Math

 


Reference : 
정규화(Normalization) 쉽게 이해하기 - 아무튼 워라밸 (hleecaster.com)

DBMS의 정규화: 1NF, 2NF, 3NF 및 BCNF [예] (hackr.io)

 

Normalization in DBMS: 1NF, 2NF, 3NF, and BCNF [Examples]

Normalization in DBMS helps reduce redundant info and removes anomalies in database systems. Read about the various forms of normalization here.

hackr.io

 

정규화(Normalization) 쉽게 이해하기 - 아무튼 워라밸

데이터 정규화는 머신러닝에서 꼭 알아야 하는 개념이다. 매우 훌륭한 데이터를 가지고도 정규화를 놓치면 특정 feature가 다른 feature들을 완전히 지배할 수 있기 때문이다. 최소 최대 정규화, Z-

hleecaster.com

 

 

 

 

'SQL 이론' 카테고리의 다른 글

뷰(View)  (0) 2023.06.05
SQL Joins  (0) 2023.05.17
DBMS의 동시성 제어  (0) 2023.05.16
DataBase Key  (0) 2023.05.16
DBMS(Database Management System)  (0) 2023.05.16

🤔 동시성 제어란 ?

동시성 제어는 여러 트랜잭션을 동시에 실행하면서도 데이터베이스의 일관성과 격리성을 보장하기 위한 기법이다.

여러 사용자가 동시에 같은 데이터에 엑세스할 때 충돌을 방지하는데 필요하다.


💯동시성 제어의 두 가지 기법

< 잠금(Locking)> < 타임스탬프(Timestamp)>

 

잠금(Locking) 기법: 잠금 기법에서는 데이터 항목에 대해 '잠금(lock)'을 설정하여 다른 트랜잭션들이 해당 데이터에 액세스하는 것을 제한한다. 잠금은 일반적으로 '읽기 잠금(공유 잠금)'과 '쓰기 잠금(배타적 잠금)'의 두 가지 유형이 있다. 읽기 잠금은 해당 데이터 항목을 읽을 수는 있지만 수정할 수는 없게 하며, 쓰기 잠금은 해당 데이터 항목을 읽거나 쓸 수 있는 트랜잭션을 한 개로 제한한다.

타임스탬프(Timestamp) 기법: 타임스탬프 기법에서는 각 트랜잭션에 고유한 타임스탬프를 할당하여 트랜잭션의 순서를 정한다. 이 기법은 트랜잭션들이 동일한 데이터에 대해 순차적으로 액세스하도록 강제함으로써 충돌을 방지한다.

이러한 기법들을 통해 DBMS는 동시에 실행되는 여러 트랜잭션들 사이에서 데이터의 일관성을 유지하고 무결성을 보장한다.

 


 

🥺 < 동시성 제어를 하지 않을 시 발생하는 문제 > 

갱신 손실 (Lost Update): 두 트랜잭션이 동시에 같은 데이터를 변경하려고 할 때, 한 트랜잭션의 변경이 다른 트랜잭션에 의해 덮어쓰여질 수 있다.

비완료 의존성 (Dirty Read): 한 트랜잭션이 아직 커밋되지 않은 변경을 읽는 경우, 그 트랜잭션이 롤백되면 일관성 없는 데이터를 보게 될 수 있다.

계층형 읽기 (Non-repeatable Read): 한 트랜잭션 도중에 같은 데이터를 두 번 이상 읽는 경우, 그 사이에 다른 트랜잭션이 그 데이터를 변경하고 커밋할 경우, 같은 트랜잭션 내에서 데이터의 일관성이 깨질 수 있다.

팬텀 읽기 (Phantom Read): 한 트랜잭션 도중에 일련의 행 (예를 들어, 특정 조건을 충족하는 행)을 두 번 이상 읽는 경우, 그 사이에 다른 트랜잭션이 새 행을 삽입하고 커밋할 경우, 같은 트랜잭션 내에서 일련의 행이 변경되는 현상을 볼 수 있다.


 

Reference :

GeeksforGeeks - Concurrency Control in DBMS

 

Concurrency Control in DBMS - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

TutorialsPoint - DBMS Concurrency Control

 

DBMS - Concurrency Control

DBMS Concurrency Control - In a multiprogramming environment where multiple transactions can be executed simultaneously, it is highly important to control the concurrency of transactions. We have concurrency control protocols to ensure atomicity, isolation

www.tutorialspoint.com

 

'SQL 이론' 카테고리의 다른 글

SQL Joins  (0) 2023.05.17
정규화(Normalization)  (0) 2023.05.16
DataBase Key  (0) 2023.05.16
DBMS(Database Management System)  (0) 2023.05.16
DataBase 일관성/무결성 제약 조건  (0) 2023.05.16

DataBase에서 Key는 Data를 구분,관리하는 데 매우 중요한 역할을 한다.

주로 기본키(PK),외래 키(FK),고유 키(UK),체크 키(CK),후보키 등의 종류가 있다.

< 기본 키(Primary Key, PK) >

기본 키는 Table에서 각 행을 고유하게 식별하는 열이다. 기본 키의 특징은 다음과 같다.

  • 고유성 : 각 행에 대해 유일한 값을 가져야 한다.
  • 무결성 : NULL값을 허용하지 않는다.
  • 테이블당 하나의 PK만 설정 가능하다.

Employees Table에서 PK를 사용했다고 가정하면 다음과 같다.

CREATE TABLE Employees (
ID INT PRIMARY KEY,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
);

 

<외래 키(Foreign Key, FK) >

외래 키는 다른 테이블의 기본 키나 고유 키를 참조할 수 있다.

고유 키는 각 행이 고유한 값을 가져야 하지만 NULL 값을 허용할 수 있다. 이는 고유 키가 기본 키와 다른 주요한 특징 중 하나이다.
따라서 외래 키가 참조하는 고유 키의 값이 NULL인 경우도 있을 수 있다. 하지만 이는 일반적으로 권장되지 않습니다. 외래 키는 데이터 무결성을 보장하는 데 중요한 역할을 하는데, 참조하는 키의 값이 NULL인 경우 데이터 무결성을 유지하는 데 문제가 발생할 수 있기 때문이다.

따라서 가능한 한 외래 키는 NULL이 아닌 고유한 값을 가진 기본 키나 고유 키를 참조하도록 설계하는 것이 좋다.

 

외래키의 특징은 아래와 같다.

  • 참조 무결성: 외래 키의 값은 참조되는 기본 키의 값 중 하나이거나 NULL이어야 한다.
  • RDBMS에서 Table 간의 관계를 나타낸다.
  • 하나의 테이블에 여러 외래 키를 설정할 수 있다.

외래 키 예시를 들면, Orders 테이블에서 Employees 테이블을 참조할 수 있다.

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderNumber INT NOT NULL,
    EmployeeID INT,
    FOREIGN KEY (EmployeeID) REFERENCES Employees(ID)
);

 

< 고유 키(Unique Key, UK) >

고유 키는 테이블의 각 행을 고유하게 식별할 수 있는 열이다. 기본 키와 비슷하지만, NULL 값을 허용한다는 점이 다르다.

 

고유 키의 특징은 아래와 같다.

  • 각 행에 대해 유일한 값을 가져야 한다.
  • NULL값을 허용할 수 있다.
  • 하나의 테이블에 여러 고유 키를 설정할 수 있다.

고유 키는 다음과 같이 설정할 수 있다. 

CREATE TABLE Employees (
    ID INT PRIMARY KEY,
    LastName VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Email VARCHAR(255) UNIQUE
);

Email 열은 고유 키로 설정되어 각 행의 Email 값은 고유해야 한다.

 

< 체크 키(Check Key, CK) >

체크 키는 특정 열의 값이 지정된 조건을 만족해야 함을 보장하는 제약 조건이다.

체크 키의 특징은 아래와 같다.

  • 데이터의 유효성 보장 한다.
  • 열에 대해 지정된 조건을 만족해야 한다.
  • 하나의 테이블에 여러 체크 키를 설정할 수 있다.

체크 키는 다음과 같이 설정할 수 있다.

CREATE TABLE Employees (
    ID INT PRIMARY KEY,
    LastName VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Age INT CHECK (Age >= 18)
);

 

Age 열은 체크 키로 설정되어 Age 값이 18 이상이어야 한다.

< 캔디데이트 키(Candidate Key) >

캔디데이트 키는 기본 키로 선택될 수 있는 키다.

캔디데이트 키는 고유성(uniqueness)과 최소성(minimality)을 만족해야 한다.

 

고유성: 캔디데이트 키가 테이블의 각 행을 고유하게 식별할 수 있어야 한다는 것. 이것은 테이블에 동일한 값의 캔디데이트 키를 가진 두 개 이상의 행이 있으면 안된다는 의미다. 예를 들어, 학생 테이블에서 학생 ID는 고유성을 가지는 키일 수 있다. 왜냐하면 각 학생은 고유한 ID를 가지므로, 이 ID를 통해 각 학생을 "정확하게 식별"할 수 있기 때문이다.
최소성: 캔디데이트 키는 가능한 작은 수의 열로 구성되어야 한다는 것이다. 이것은 캔디데이트 키의 모든 부분이 행을 식별하는 데 필요하다는 의미이다. 예를 들어, 만약 학생 테이블에서 학생 ID와 성별을 결합하여 캔디데이트 키를 만들었다면, 이 키는 최소성을 만족시키지 못한다. 왜냐하면 학생 ID만으로도 각 학생을 고유하게 식별할 수 있기 때문이다. 따라서, 성별 열은 캔디데이트 키에서 불필요하게 된다.

 

예를 들어, 학생들에 대한 정보를 저장하는 'Students' 테이블이 있다고 가정해 보자.

CREATE TABLE Students (
StudentID INT,
Email VARCHAR(255),
FirstName VARCHAR(255),
LastName VARCHAR(255)
);

여기서 'StudentID'와 'Email' 열은 각각 Candidate Key가 될 수 있다. 왜냐하면 이들은 각각 학생들을 고유하게 "식별"할 수 있기 때문이다. 따라서 이들 중 하나를 기본 키로 선택할 수 있다.

CREATE TABLE Students (
StudentID INT PRIMARY KEY,
Email VARCHAR(255) UNIQUE,
FirstName VARCHAR(255),
LastName VARCHAR(255)
);

이 예제에서 'StudentID'는 기본 키로 선택되었고, 'Email'은 고유 키로 설정되었다.

이 두 키 모두 Candidate Key이다.

 

PK로 선택되지 않은 Candidate Key("Email")은 대체 키(alternate key)라고도 부른다.

이는 기본 키로 선택될 수 있는 대체 선택지라는 의미다.

 

그럼 어떤 상황에서 alternate key가 pk로 대체 될까?

1) 비즈니스 요구사항 변경 : 비즈니스 요구사항이 변경되어 기존 PK가 더이상 각 행을 유일하게 식별하지 못하거나,

새로운 요구사항을 충족시키지 못하는 경우 대체 키를 기본 키로 변경할 수 있다.

2. 데이터 구조 변경: 테이블의 데이터 구조가 변경되어 기존 PK가 더 이상 적절하지 않은 경우 대체 키를 기본 키로 변경할 수 있다. 예를 들어, 테이블을 분할하거나 병합하는 경우 기존의 기본 키가 더이상 유용하지 않을 수 있다. 

 

이러한 상황 외에 테이터베이스의 설계방식에 따라 다양한 방식에서 대체 키가 기본 키로 사용될 수 있다. 

'SQL 이론' 카테고리의 다른 글

정규화(Normalization)  (0) 2023.05.16
DBMS의 동시성 제어  (0) 2023.05.16
DBMS(Database Management System)  (0) 2023.05.16
DataBase 일관성/무결성 제약 조건  (0) 2023.05.16
Mysql 설치 및 DBeaver 설치 방법 (Windows)  (0) 2023.05.14

데이터베이스 관리 시스템(DBMS):다양한 종류의 데이터베이스를 효율적으로 관리하기 위한 소프트웨어이다.

< 주요 기능 >

데이터 정의: DBMS는 '데이터 정의 언어(DDL)를 사용해 데이터베이스 구조를 정의하고 수정할 수 있다. 예를 들면, 테이블 생성이나 인덱스 설정 같은 것이 있다.


데이터 분석 및 관리: '데이터 조작 언어(DML)'를 사용해 데이터베이스에서 원하는 데이터를 찾거나 수정할 수 있다. 대표적인 예로는 SQL(Structured Query Language)이 있다.

 

데이터 보안 및 접근 권한: '데이터 제어 언어(DCL)'를 통해 데이터베이스 접근 권한을 설정하고 보안을 관리한다. 권한 부여 및 회수, 제약 조건 설정 등을 통해 데이터를 안전하게 보호할 수 있다.

관리와 최적화: DBMS는 데이터베이스의 성능을 향상시키고 효율적인 관리를 위한 다양한 기능을 제공한다. 데이터 저장, 인덱싱, 캐싱 등을 자동적으로 처리해 준다.

복구와 백업: 무시할 수 없는 중요한 기능 중 하나는 데이터 복구와 백업이다. DBMS는 데이터 손실을 방지하고 안전하게 저장할 수 있도록 데이터베이스를 주기적으로 백업한다. (예를 들어 오라클에는 Hot Backup,Cold Backup, RMan Backup,Export Backup이 있다.)


애플리케이션과 시스템들은 이런 DBMS 도구를 이용해 데이터를 구조화하고 저장하며, 관리하고 검색하는 역할을 하고 있다. 대표적인 DBMS 제품으론 Oracle Database, MySQL, Microsoft SQL Server, PostgreSQL, MongoDB 등이 있다.

'SQL 이론' 카테고리의 다른 글

DBMS의 동시성 제어  (0) 2023.05.16
DataBase Key  (0) 2023.05.16
DataBase 일관성/무결성 제약 조건  (0) 2023.05.16
Mysql 설치 및 DBeaver 설치 방법 (Windows)  (0) 2023.05.14
트랜잭션(Transaction)  (0) 2023.04.13

참고: https://www.ibm.com/docs/en/cics-ts/5.4?topic=processing-acid-properties-transactions 

https://www.techopedia.com/definition/27386/consistency-databases

 

Consistency

This definition explains the meaning of Consistency and why it matters.

www.techopedia.com

 

ACID properties of transactions

In the context of transaction processing, the acronym ACID refers to the four key properties of a transaction: atomicity, consistency, isolation, and durability. Atomicity All changes to data are performed as if they are a single operation. That is, all th

www.ibm.com

 

DataBase의 "일관성(Consistency)"은 Transaction이 성공적으로 완료되어도 항상 데이터베이스를 일관된 상태로 유지해야 한다는 원칙을 의미 한다.

즉, Transaction의 실행 결과가 데이터베이스의 일관성을 유지하는 데 기여하는 무결성 제약 조건을 준수해야한다는 것을 의미한다.

 

< 일관성을 보장하는 Transaction의 예시 > 

START TRANSACTION;

-- 송금자 계좌에서 돈을 빼기
UPDATE Accounts SET balance = balance - 1000 WHERE account_id = 1;

-- 수신자 계좌에 돈 추가
UPDATE Accounts SET balance = balance + 1000 WHERE account_id = 2;

COMMIT;

위의 코드에서는 "START TRACSACTION"과 "COMMIT" 사이에 이루어지는 모든 작업이 원자성을 가지기에

이에 따라 일관성이 보장 된다. 

< 트랜잭션 실행결과가 무결성 제약 조건을 준수해야 하는 이유 >

 

1) 정확성 보장 :

무결성 제약조건은 데이터가 정확하고 유효한 값만 가지도록 보장한다.

예를 들어, 특정 필드에는 숫자만 입력되어야 하며, 또 다른 필드에는 NULL 값이 허용 되지 않는 등의

규칙을 설정할 수 있다.

 

2) 일관성 유지 :

무결성 제약조건은 데이터베이스의 일관성을 유지하는데 중요한 역할을 한다.

예를 들어, 외래 키 제약 조건은 RDBMS에서 Table간의 관계를 정의하고 유지하는데 사용한다.

이를 통해 무효한 데이터나 참조 무결성 오류를 방지할 수 있다.

 

3) 신뢰성 ↑ :

무결성 제약조건이 준수되면, 데이터베이스에 저장된 정보가 신뢰성이 높아진다.

이는 비즈니스 결정이나 분석에 사용되는 데이터의 품질이 보장되므로, 더 나은 결과를 얻을 수 있다. 

 

따라서, 트랜잭션의 실행결과가 무결성 제약조건을 준수하도록 하는 것은 데이터베이스 시스템의 정확성,일관성,신뢰성을 보장하는데 필수적이다. 

 

 

 

< 무결성 제약 조건 >

1.Domain constraints condition in RDBMS : 각 열은 명시적으로 선언된 도메인(예:숫자, 문자열, 날짜 등)의 값만 가져야 한다.도메인이란 데이터베이스 테이블의 특정 열에 허용되는 값의 집합을 말한다.

예를 들어, 개발자가 특정 필드의 타입을 '정수(int)'로 설정했다면, 그 필드에는 정수 값만 입력될 수 있다.

만약 문자열(String)이나 다른 데이터 타입 값이 그 필드에 입력되려고 하면, 데이터베이스 시스템은 그것을 거부하고 오류 메세지를 반환할 것이다.

 

2.기본 키 제약 조건: 기본 키는 테이블의 각 레코드를 고유하게 식별하는 역할을 한다.

그래서 기본 키 필드는 고유한 값만 가져야 하며, NULL 값을 가질 수 없다. 즉, 같은 테이블에 어떤 레코드도 같은 기본 키 값을 가질 수 없다. (두 개의 테이블이 있다고 가정 했을 때, 두 개의 테이블에 같은 이름을 가진 기본키가 있어도 된다.

기본 키 제약 조건은 같은 테이블 내에서 각 레코드를 고유하게 식별할 수 있어야 한다는 것을 의미한다. 즉, 동일한 테이블 내에서 같은 기본 키 값을 갖는 레코드가 있으면 안된다는 것.)

 

3.외래 키 제약 조건: 외래 키는 다른 테이블의 특정 레코드를 참조하는 역할을 한다. 외래 키 필드의 값은 참조하는 테이블의 기본 키 값 중 하나여야 한다. 이를 통해 관계형 데이터베이스에서 테이블 간의 관계를 정의하고 유지할 수 있다.

 

4.사용자 정의 제약 조건: 개발자 또는 데이터베이스 관리자가 특정 비즈니스 규칙이나 도메인 규칙을 데이터베이스에 추가하기 위해 설정하는 조건.

예를 들어 '나이'라는 열의 값이 0보다 크고 120보다 작아야 한다는 규칙을 사용자 정의 제약 조건으로 설정할 수 있다.

이는 나이 값이 현실적인 범위 내에 있어야 한다는 제약을 나타낸다.

 

< 사용자 정의 제약 조건 예제 코드 (MySQL) >

--테이블 생성
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
CONSTRAINT CHK_AGE CHECK (age > 0 AND age < 120)
);

 

 

 

 

 

 

 

 

 

  

'SQL 이론' 카테고리의 다른 글

DataBase Key  (0) 2023.05.16
DBMS(Database Management System)  (0) 2023.05.16
Mysql 설치 및 DBeaver 설치 방법 (Windows)  (0) 2023.05.14
트랜잭션(Transaction)  (0) 2023.04.13
row와 column이 뭐에요?  (0) 2022.07.28

Assert.isTrue()는 Spring Framework에서 제공하는 Assertion 유틸리티 클래스인 Assert 클래스의 메소드 중 하나로, 주어진 boolean 표현식이 참(true)인지를 검사하고, 만약 그렇지 않으면 예외를 발생시킨다.

Assert.isTrue() 메소드는 다음과 같은 형태로 사용할 수 있다.

publicstaticvoidisTrue(boolean expression, String message)

여기서 expression은 검사할 "boolean" 표현식이며, message는 예외가 발생했을 때 출력할 "메시지"다.

아래는 Assert.isTrue() 예시 코드.

import org.springframework.util.Assert;

public class Example {
    public void doSomething(int value) {
      //value > 0 <- expression, "value must be greater than 0" <- message
        Assert.isTrue(value > 0, "value must be greater than 0");
  
    }
}

위 코드에서 Assert.isTrue() 메소드를 사용하여 value 변수가 0보다 큰지를 검사한다. 만약 value 변수가 0 이하의 값이라면 IllegalArgumentException 예외가 발생하며, 예외 메시지로는 "value must be greater than 0"가 출력된다.(Custom Error Message를 써도 좋다.)

즉, Assert.isTrue() 메소드는 주어진 조건이 참인지 검사하여, 그렇지 않을 경우 예외를 발생시킴으로써 코드의 안정성과 신뢰성을 높이는 데 사용된다.

true면 아무 메세지가 출력되지 않는다.

'Java' 카테고리의 다른 글

Java Garbage Collection  (0) 2023.06.07
Thread async in Java  (0) 2023.06.02
Wrapper Class  (0) 2023.05.14
05.인스턴스 생성과 힙 메모리  (0) 2023.04.23
04.객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다.  (0) 2023.04.23

< 쿠키 >

①.쿠키(cookie)?

1) 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법

2) 쿠키는 세션과 달리 상태 정보를 웹 서버가 아닌 클라이언트에 저장된다.

- 예를 들어 어떤 웹사이트를 처음 방문한 사용자가 로그인 인증을 하고 나면 아이디와 비밀번호를 기록한 쿠키가 만들어지고 그 다음부터 사용자가 그 웹 사이트에 접속하면 별도의 절차를 거치지 않고 쉽게 접속할 수 있다.

3) 클라이언트의 일정 폴더에 정보를 저장하기 때문에 웹 서버의 부하를 줄일 수 있다는 것이 장점 이다.

4) 웹 브라우저가 접속했던 웹 사이트에 관한 정보와 개인 정보가 기록되기 때문에 보안에 문제가 있을 수 있다.


< ②.쿠키의 동작 과정 >

1) 쿠키 생성 단계 :주로 웹 서버 측에서 생성한다. 생성된 쿠키는 응답 데이터와 함께 저장되어 웹 클라이언트에 전송 된다.

2) 쿠키 저장 단계 :웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관한다. 쿠키는 종류에 따라 메모리나 파일로 저장된다.

3) 쿠키 전송 단계 :웹 브라우저는 한 번 저장된 쿠키를 요청이 있을때 마다 웹 서버에 전송 한다.

웹 서버는 웹 브라우저가 전송한 쿠키를 사용하여 필요한 작업을 수행할 수 있다. 

 


<③.Cookie class의 메서드 종류 >

메소드 반환 유형 설명
getComment() String 쿠키에 대한 설명을 반환
getDomain() String 쿠키의 유효한 도메인 정보를 반환
getMaxAge() int 쿠키의 사용 가능 기간에 대한 정보를 반환
getName() String 쿠키의 이름을 반환
getPath() String 쿠키의 유효한 디렉터리 정보를 반환
getSecure() boolean 쿠키의 보안 설정을 반환
getVersion() int 쿠키의 버전을 반환
setComment(String) void 쿠키에 대한 설명을 설정
setDomain() void 쿠키의 유효 기간을 설정
setPath() void 쿠키의 유효한 디렉터리를 설정
setSecure() void 쿠키의 보안을 설정
setValue() void 쿠키의 값을 반환
setVersion() void 쿠키의 버전을 설정

< 세션 >

①.세션(cookie)?

1) 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법

 - 예를 들면 웹 쇼핑몰에서 장바구니나 주문 처리와 같은 회원 전용 페이지의 경우 로그인 인증을 통해 사용 권한을 부여

 - 다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지되므로 회원 전용 페이지를 계속 사용할 수 있다.

 - 이렇게 사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것

2) 웹 서버에서만 접근이 가능하므로 보안 유지에 유리하며 데이터를 저장하는데 한계가 없다.

3) 오직 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하므로 웹 서버의 서비스를 제공받는 사용자를 구분하는 단위가 된다.

4) 웹 브라우저를 닫기 전까지 웹 페이지를 이동하더라도 사용자의 정보가 웹 서버에 보관되어 있어 사용자 정보를 잃지 않는다.


< 쿠키와 세션의 차이 >

메소드 쿠키 세션
사용 클래스 Cooke 클래스 HttpSession 인터페이스
저장 형식 텍스트 형식 Object형
저장 장소 클라이언트 서버(세션 아이디만 클라이언트에 저장)
종료 시점 쿠키 저장시 설정(설정하지 않을 경우
웹 브라우저 종료 시 소멸)
정확한 시점을 알 수 없다
리소스  클라이언트의 리소스 사용 서버의 리소스 사용
보안 클라이언트에 저장되므로 사용자의
변경이 가능하여 보안에 취약
서버에 저장되어 있어 상대적으로 안정적

 

 

출처: 인터넷프로그래밍 교안

'Developer 지식' 카테고리의 다른 글

서버프로그램 구현  (0) 2023.05.22
스프링과 스프링부트  (0) 2023.05.16
오버라이딩과 시그니처의 연관성  (0) 2023.05.14
숫자 리터럴(literal)  (0) 2023.05.14
PDT,UDDT/기본자료형,사용자 정의 자료형  (0) 2023.05.14

DBeaver 접속 후, localhost 접속 시 아래와 같은 에러 발생 


< 해결 방법 >

Mysql 설치 중, 내 컴퓨터에는 사용 중인 3306의 Port가 있어서, 3307 Port로 Setting후 설치하였다. 이후 DBeaver에서 Mysql 접속 시 3307Port로 접속 했어야 했는데, 3306의 Port로 접속하여서 "unable to load authentication plugin 'auth_gssapi_client'." Error가 뜬 것이었다.

아래와 같이 3307로 변경 후 해결 완료. 

< Wrapper Class(래퍼 클래스)란? >

Java에서 "기본 자료형"(Primitive Data Type)을 "객체(Object)"로 다루기 위해 제공하는 클래스.

기본 자료형에 각각 대응하는 래퍼 클래스가 1:1로 존재한다.

이를 통해 기본 타입의 값을 객체로 변환하거나 객체에서 기본 타입의 값을 추출할 수 있다.

각 기본 자료형에 대응하는 래퍼 클래스는 다음과 같다.


boolean -> java.lang.Boolean

byte -> java.lang.Byte

char -> java.lang.Character

short -> java.lang.Short

int -> java.lang.Integer

long -> java.lang.Long

float -> java.lang.Float

double -> java.lang.Double


래퍼 클래스를 사용하면 기본 자료형에 대해 객체지향적인 기능을 사용할 수 있다.

예를 들어, 래퍼 클래스의 인스턴스를 컬렉션에 저장 혹은 메서드에서 객체 형태로 전달할 수 있다.

Java에서는 오토박싱(Auto-boxing)과 오토언박싱(Auto-unboxing) 기능을 제공하여 기본 자료형과 래퍼 클래스 간의 변환을 자동으로 처리할 수 있다. 이를 통해 개발자는 래퍼 클래스와 기본 자료형 간의 변환 작업을 명시적으로 처리할 필요가 없어져 코드 작성이 간결해진다.

+ Recent posts