Database2024. 9. 11. 10:26

정규화(normalization) 에 대해 ChatGPT 에 물어 보았다.

관계형 데이터베이스 설계 시 데이터 중복을 줄이고 무결성을 유지하기 위한 정규화 과정입니다. 각 단계에서 데이터 구조가 개선됩니다.

1차 정규화 (1NF)

  • 목표: 테이블 내 모든 필드가 원자값(더 이상 나눌 수 없는 값)을 갖도록 만듦.
  • 조건: 각 컬럼에 중복되는 데이터나 여러 값이 포함되지 않도록, 하나의 셀에는 하나의 값만 존재해야 함.

예시:

  • 전화번호가 하나의 컬럼에 "010-1234-5678, 010-9876-5432"처럼 들어있으면 1NF가 아님.
  • 이를 각각의 행으로 분리하거나 별도의 테이블로 분리하여 원자값을 만듦.

 

2차 정규화 (2NF)

  • 목표: 부분 함수 종속을 제거.
  • 조건: 1NF를 만족하고, 테이블의 모든 비주요 속성이 기본키에 완전 함수 종속되어야 함. 즉, 기본키의 일부분에만 종속되는 속성들을 제거.

예시:

  • 학생 테이블에서 학번과 과목으로 성적을 관리하는 경우, 과목명에 대한 정보는 학번과 관계없이 과목에만 종속됨. 이를 별도의 테이블로 분리하여 성적 테이블은 학번과 과목만 다루고, 과목 정보는 과목 테이블로 관리.

 

3차 정규화 (3NF)

  • 목표: 이행적 함수 종속을 제거.
  • 조건: 2NF를 만족하고, 기본키가 아닌 속성들이 서로 종속되지 않아야 함. 즉, 비주요 속성이 다른 비주요 속성에 의존하지 않도록 분리.

예시:

  • 직원 테이블에 직원 ID, 부서 ID, 부서명 등이 있는 경우, 부서명은 부서 ID에만 종속되어야 함. 이때 부서 정보를 따로 분리하여 관리.

이러한 정규화 과정을 통해 데이터 중복을 최소화하고, 데이터 일관성과 무결성을 유지할 수 있습니다.

더 쉽게 설명해달라고 해보았다.

정규화는 데이터베이스에서 데이터를 깔끔하고 효율적으로 관리하기 위한 과정이에요. 1차, 2차, 3차 정규화는 데이터를 단계별로 더 잘 정리하는 방법입니다. 쉽게 설명하면:

1차 정규화 (1NF)

  • 뭐하는 거야?: 각 칸에 하나의 정보만 넣기.
  • 예시: "전화번호" 칸에 여러 개의 번호가 들어 있으면 안 돼요. 각각의 번호를 따로 칸에 넣어야 해요.
    • 잘못된 예시: 전화번호: 010-1234-5678, 010-9876-5432
    • 고친 예시: 전화번호: 010-1234-5678 (각 번호를 따로 관리)

 

2차 정규화 (2NF)

  • 뭐하는 거야?: 주요한 정보(기본키)에만 의존하도록 정리하기.
  • 예시: 학생의 학번과 과목별 성적을 기록하는데, 과목 이름과 학번이 섞여 있으면 안 돼요. 과목 정보는 따로 테이블로 만들어서 관리하면 깔끔해요.
    • 잘못된 예시: 학번 + 과목 이름 + 성적
    • 고친 예시: 과목은 따로 과목 테이블에서 관리하고, 성적 테이블은 학번과 과목 ID만 기록.

 

3차 정규화 (3NF)

  • 뭐하는 거야?: 불필요한 연결 없애기.
  • 예시: 직원 테이블에 부서 이름이 들어가 있으면, 나중에 부서 이름이 바뀔 때 여러 곳을 고쳐야 할 수 있어요. 이럴 땐 부서 ID만 넣고, 부서 정보는 부서 테이블에서 따로 관리하면 좋아요.
    • 잘못된 예시: 직원ID + 부서 이름
    • 고친 예시: 직원ID + 부서ID (부서 이름은 부서 테이블에서 따로 관리)

정리하면:

  1. 각 칸에 하나의 정보만 넣고,
  2. 중복된 정보는 따로 떼어내서,
  3. 관련 없는 정보끼리는 따로 보관해요.

이렇게 하면 데이터가 덜 중복되고, 나중에 변경하기 쉬워집니다!

Posted by 비니미니파파
Java&Jsp&Servlet2024. 8. 27. 10:50

DateTimeFormatter 을 사용해야 하는 이유? ( by ChatGPT)

  • DateTimeFormatter: 자바 8 이상에서 도입된 java.time 패키지는 국제 표준 ISO-8601을 기본으로 하여 설계되었습니다. 따라서 DateTimeFormatter를 사용하면 국제 표준에 더 잘 부합하는 코드를 작성할 수 있습니다.
  • SimpleDateFormat: 자바 초기 버전에서 도입된 만큼 현대적 표준을 따르지 않는 부분이 있습니다.

특히 SimpleDateFormat 은 스레드에 안전하지 않는다고 한다.

그래서, DateTimeFormatter 을 이용한 날짜, 시간 더하기

package study.d4emon.test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

public class DateAddLocaleDate {

	public static void main(String[] args) {
		
        // LocalDate
        LocalDate localeToday = LocalDate.now();

        // Firtday of Month
        LocalDate firstDayOfMonth = localeToday.with(TemporalAdjusters.firstDayOfMonth());

        // DateTimeFormmater
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // today
        String today = localeToday.format(formatter);

        System.out.println("Today : " + today);

        // firstDay
        String firstDay = firstDayOfMonth.format(formatter);
        System.out.println("FirstDay : " + firstDay);

        // 하루 더하기
        String addDate = localeToday.plusDays(+1).format(formatter);
        System.out.println("Add 1 Day : " + addDate);

        // 한달 더하기
        addDate = localeToday.plusMonths(+1).format(formatter);
        System.out.println("Add 1 Month : " + addDate);

        // 1년 더하기
        addDate = localeToday.plusYears(+1).format(formatter);
        System.out.println("Add 1 year : " + addDate);

        // 시분초 까지 표시하려면
        System.out.println("시분초 까지 표시하려면 ....");
        formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        System.out.println("DateTime: " + now.format(formatter));

		// 15초 더하기
        LocalDateTime nextSecond = now.plusSeconds(15); 
        System.out.println("Add 15 Sec: " + nextSecond.format(formatter));

		// 30분 더하기
        LocalDateTime nextMinute = now.plusMinutes(30); 
        System.out.println("Add 30 Min: " + nextMinute.format(formatter));

		// 1시간 더하기
        LocalDateTime nextHour = now.plusHours(1); 
        System.out.println("Add 1 Hour : " + nextHour.format(formatter));
        
	}

}

 

Posted by 비니미니파파
Database/Oracle2024. 8. 16. 10:42

소숫점 자리수를 표시할 때 화면에서 정렬을 위해 0으로 채워달라는 경우가 있다.

예 ) 0.123 -> 0.12300

FM (Fill Mode) 을 사용하자.

SELECT TO_NUMBER('0.123') AS VAL FROM DUAL

-> 0.123

SELECT TO_CHAR(TO_NUMBER('0.123'),'FM999,999,990.00000') AS VAL FROM dual;

-> 0.12300

많이 사용하는 라운드(ROUND:반올림)와 같이

SELECT TO_CHAR(ROUND(TO_NUMBER('0.123'),5),'FM999,999,990.99999') AS VAL FROM dual;

FM 에 대해서 공부하려면 

https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#SQLRF00210

 

Format Models

The total length of a datetime format model cannot exceed 22 characters. The default datetime formats are specified either explicitly with the NLS session parameters NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, and NLS_TIMESTAMP_TZ_FORMAT, or implicitly with the

docs.oracle.com

 

끝 

Posted by 비니미니파파
Database/Oracle2024. 7. 12. 11:40

Table 복사

* 테이블 변경 시 테이블 자체를 백업 해 놓고 싶을때 자주 사용.

CREATE TABLE [TBL_NEW_NAME] AS SELECT * FROM [TBL_NAME]

CREATE TABLE TBL_MEMBER_BACKUP AS SELECT * FROM TBL_MEMBER

 

Posted by 비니미니파파

삼항 연산자
count = ( $("#count").val() != "" ) ? parseInt($("# count").val()) : 0;

논리 연산자
count = parseInt($("# count").val()) || 0;

  • 삼항 연산자는 조건부 선택을 통해, 조건이 true인지 false인지에 따라 서로 다른 값을 반환
  • || 연산자는 단순 논리 OR로, 첫 번째 truthy 값을 반환

단순 값이 없을때 default 값을 정해야 할때. || (or 연산자)를 사용하면 편함.

Posted by 비니미니파파