반응형

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

당신은 동영상 재생기를 만들고 있습니다. 당신의 동영상 재생기는 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 3가지 기능을 지원합니다. 각 기능이 수행하는 작업은 다음과 같습니다.

10초 전으로 이동: 사용자가 "prev" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 전으로 이동합니다. 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동합니다. 영상의 처음 위치는 00초입니다.

10초 후로 이동: 사용자가 "next" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 후로 이동합니다. 동영상의 남은 시간이 10초 미만일 경우 영상의 마지막 위치로 이동합니다. 영상의 마지막 위치는 동영상의 길이와 같습니다.

오프닝 건너뛰기: 현재 재생 위치가 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우 자동으로 오프닝이 끝나는 위치로 이동합니다.

동영상의 길이를 나타내는 문자열 video_len, 기능이 수행되기 직전의 재생위치를 나타내는 문자열 pos, 오프닝 시작 시각을 나타내는 문자열 op_start, 오프닝이 끝나는 시각을 나타내는 문자열 op_end, 사용자의 입력을 나타내는 1차원 문자열 배열 commands가 매개변수로 주어집니다. 이때 사용자의 입력이 모두 끝난 후 동영상의 위치를 "mm:ss" 형식으로 return 하도록 solution 함수를 완성해 주세요.

 

제한사항

video_len의 길이 = pos의 길이 = op_start의 길이 = op_end의 길이 = 5

video_len, pos, op_start, op_end"mm:ss" 형식으로 mm분 ss초를 나타냅니다.

0 ≤ mm ≤ 59

0 ≤ ss ≤ 59

, 초가 한 자리일 경우 0을 붙여 두 자리로 나타냅니다.

비디오의 현재 위치 혹은 오프닝이 끝나는 시각이 동영상의 범위 밖인 경우는 주어지지 않습니다.

오프닝이 시작하는 시각은 항상 오프닝이 끝나는 시각보다 전입니다.

1 ≤ commands의 길이 ≤ 100

commands의 원소는 "prev" 혹은 "next"입니다.

"prev"10초 전으로 이동하는 명령입니다.

"next"10초 후로 이동하는 명령입니다.

 

입출력 예 #1

시작 위치 130초에서 10초 후로 이동하면 1310초입니다.

1310초에서 10초 전으로 이동하면 130초입니다.

따라서 "13:00"return 하면 됩니다.

입출력 예 #2

시작 위치 05초에서 10초 전으로 이동합니다. 현재 위치가 10초 미만이기 때문에 00초로 이동합니다.

00초에서 10초 후로 이동하면 010초입니다.

010초에서 10초 후로 이동하면 020초입니다. 020초는 오프닝 구간이기 때문에 오프닝이 끝나는 위치인 655초로 이동합니다. 따라서 "06:55"return 하면 됩니다.

입출력 예 #3

시작 위치 45초는 오프닝 구간이기 때문에 오프닝이 끝나는 위치인 47초로 이동합니다. 47초에서 10초 후로 이동하면 417초입니다. 따라서 "04:17"return 하면 됩니다.

 

 

나의 문제풀이 방법

class Solution {		
    		
    static int videoTime;		
    static int posTime;		
    static int opStTime;		
    static int opEndTime;		
    static int totalseconds;		
		
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {		
        totalseconds = 0;		
        posTime = parseTimeToSeconds(pos);  //재생위치		
        videoTime = parseTimeToSeconds(video_len);  //동영상길이		
        opStTime = parseTimeToSeconds(op_start);  //오프닝 시작		
        opEndTime = parseTimeToSeconds(op_end);  //오프닝종료		
        totalseconds = posTime;		
        		
        openingSkip();		
        		
        //cammand 추출		
        for(int i=0; i<commands.length; i++) {          		
            int sec = 10;               		
            if("prev".equals(commands[i])) {		
                totalseconds = totalseconds-sec;		
                		
                if(totalseconds < 10) {		
                    totalseconds=0;		
                }		
               		
            }else if("next".equals(commands[i])) {		
                totalseconds = totalseconds+sec;		
                		
                if(videoTime-totalseconds <10) {		
                    totalseconds =videoTime;		
                }		
            }		
            openingSkip();		
            		
        }		
        		
        String result = formatSecondsToTime(totalseconds);		
        return result;		
    }		
    		
    //"mm:ss"형식의 문자열을 초 단위의 정수로 변환		
    public static int parseTimeToSeconds(String time) {		
        String[] parts = time.split(":");		
        int minutes = Integer.parseInt(parts[0]);		
        int seconds = Integer.parseInt(parts[1]);		
        return (minutes * 60) +seconds;		
        		
    }		
    		
    //초 단위의 정수를 "mm:ss "형식으로 변환		
    public static String formatSecondsToTime(int totalseconds) {		
        int minutes = totalseconds / 60;		
        int seconds = totalseconds % 60;		
        //2자리가 되지 않을 경우, 최소 2자리를 채우고 앞의 빈자리는 0으로 표시		
        return String.format("%02d:%02d", minutes, seconds);		
    }		
    		
    public static void openingSkip(){		
         //오프닝 건너뛰기		
        if(opStTime <= totalseconds && totalseconds <=opEndTime) {		
            totalseconds = opEndTime;        		
        }		
    }		
 		
}		
		
참고 문제풀이		
import java.time.LocalTime;		
import java.time.format.DateTimeFormatter;		
		
class Solution {		
    		
   static LocalTime videoTime;		
    static LocalTime posTime;		
    static LocalTime opStartTime;		
    static LocalTime opEndTime;		
		
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {		
        String[] videoLen = video_len.split(":");		
        String[] posSplit = pos.split(":");		
        String[] opStart = op_start.split(":");		
        String[] opEnd = op_end.split(":");		
        videoTime = getTime(videoLen); // 전체 동영상 시간		
        posTime = getTime(posSplit); // 현재 재생위치		
        opStartTime = getTime(opStart); // 오프닝 시작 위치		
        opEndTime = getTime(opEnd); // 오프닝 끝 위치		
		
        skipOp(); // 오프닝 스킵		
		
        for (String command : commands) {		
            if (command.equals("prev")) {		
                moveToPrev(); // 10초 전으로 이동		
            } else {		
                moveToNext(); // 10초 후로 이동		
            }		
		
            skipOp(); // 오프닝 스킵		
        }		
		
        return posTime.format(DateTimeFormatter.ofPattern("mm:ss"));		
    }		
		
    // 10초 후로 이동하는 메소드		
    private static void moveToNext() {		
		
        posTime = posTime.plusSeconds(10);		
        if (posTime.isAfter(videoTime)) { // 전체 동영상 시간을 넘어가는 경우		
            posTime = videoTime;		
        }		
    }		
		
    // 10초 전으로 이동하는 메소드		
    private static void moveToPrev() {		
		
        int minute = posTime.getMinute();		
        int second = posTime.getSecond();		
		
        if (minute == 0 && second < 10) { // 현재 재생위치10초 전으로 이동하면 0초가 되는 경우		
            posTime = LocalTime.of(0, 0, 0);		
            return;		
        }		
		
        posTime = posTime.minusSeconds(10);		
    }		
		
    // 오프닝 스킵하는 메소드		
    private static void skipOp() {		
		
        if (!posTime.isBefore(opStartTime) && !posTime.isAfter(opEndTime)) {		
            posTime = opEndTime;		
        }		
    }		
		
    // 문자열로 표현된 시간 LocalTime타입으로 변경하는 메소드		
    private static LocalTime getTime(String[] split) {		
		
        int min = Integer.parseInt(split[0]);		
        int sec = Integer.parseInt(split[1]);		
		
        return LocalTime.of(0, min, sec);		
    }		
 		
}
반응형

@Mapper를 사용하려면 mybatis 라이브러리가 추가되어있어야 함

 -pom.xml

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.3</version>
</dependency>

 

* Mapper Interface 생성

- mapper.xml에 있는 sql쿼리문 호출하기 위한 인터페이스

 - dao 대신 @Mapper어노테이션 사용

 

* Mapper xml 생성

- mapper namespace 값을 Mapper Interface 경로로 지정

- mapper.xml파일의 id는 mapper Interface의 메소드명과 동일

'백엔드' 카테고리의 다른 글

[Spring] properties 동적 로딩 @Value 주입  (0) 2022.08.09
SOAP API 와 REST API의 차이점  (0) 2022.01.21
반응형

properties를 아래와 같이 개발/운영 분리해서 사용할 경우 동적으로 properties를 셋팅할 수 있는 방법을 설명하려고 한다. 

- properties를 분리해야 하는 이유

  개발 진행 시 DB연결 정보나 외부 API정보들을 로컬/개발/운영 등 환경에 따라

  맞는 정보를 불러와야 함(properties하나로 사용할 경우 데이터 및 주석 변경이 번거롭게 필요)

  내용 수정 후 다시 컴파일 해야함

  유지보수, 보안성 측면에서도 고정된 설정정보보다 분리하여 관리하는것이 좋음

 

1. context-common.xml 설정 

context-common.xml 상단 beans에 스키마를 추가해야 함

util:properties 사용하기  

 - xmlns:util="http://www.springframework.org/schema/util" 추가

 - xsi:schemaLocation내에 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd 추가

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
   xmlns:tx="http://www.springframework.org/schema/tx" xmlns:beans="http://www.springframework.org/schema/cache"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

<context:annotation-config/>

<!-- dynamic config.properties -->
<util:properties id="config" location="classpath:properties/#{systemProperties['spring.profiles.active']}/db.properties"/>
</beans>

<util:properties id="프로퍼티ID" location="classpath:경로/프로퍼티명"/> 선언

경로를 위와같이 설정하면 systemProperties를 불러와야하므로

로컬 톰캣과 같은 경우는 아래와 같이 설정

 

  -Dspring.profiles.active="local"

개발이나 운영인 D빼고 설정

 

 

java에서 사용할 경우 @Value를 사용가능

@Value("#{config['db.username']}") 
private String dbUser;

@Value("#{프로퍼티ID['프로퍼티 내 선언 변수명']}") 
private String dbUser;

jsp에서 사용할 경우

<%taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<spring:eval var="commonLang" expression="@프로퍼티ID['프로퍼티 내 선언변수명']"/>

xml에서 사용할 경우

<property name="프로퍼티명" value="#{프로퍼티ID['프로퍼티 내 선언변수명']}" />

 

'백엔드' 카테고리의 다른 글

[springBoot] @Mapper 사용하기  (0) 2022.09.02
SOAP API 와 REST API의 차이점  (0) 2022.01.21
반응형

#한줄주석

(소스 위쪽이나 문장끝에 작성)

#주석테스트 1
print("test1")

print("test2") #주석테스트2

정상 출력

""" 여러줄 주석

(''' 작은따옴표로 대체가능) 

 

"""
안녕하세요.
주석테스트중입니다.
아래 내용에 대한 주석은
여기에 남겨주시기바랍니다.
"""
print("test3") 

'''
안녕하세요.
주석테스트중입니다.
아래 내용에 대한 주석은
여기에 남겨주시기바랍니다.
'''
print("test4")

정상 출력

 

* 주석 단축키 :  CTRL + /

반응형

개발해놓은 결제로직 테스트를 위한

테스트페이지를 만들어보다가 다양한 경우의 수 테스트를 가로로 정렬해서 한눈에 보면 좋겠다고

생각해서 찾아보았다.

 

백엔드 개발자라서 html/css쪽은 잘 모르는데 flex속성으로 간단하게 정렬할수 있다는걸 알고 WOW

 

우선 각 table들을 div로 감싸고 

상위 div로 전체를 감싸준다.  

 

상위 div에는 "display: flex;" 속성을 주고

각 table을 감싼 div에는 "flex: 1"  속성을 주면 끝

 

 

<예제소스>

<div style="display: flex;">
	<div style="flex: 1">
		<form name="payForm1" action="" method="post" >
			<table>
				<tr>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                	<td></td>
                    <td></td>
                </tr>
			</table>
		</form>
	</div>
	<div style="flex: 1">
		<form name="payForm2" action="" method="post" >
            <table>
                <tr>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                </tr>
            </table>         
        </form> 
	</div>
	<div style="flex: 1">
		<form name="payForm3" action="" method="post" >
			<table>
                <tr>
                	<td></td>
                	<td></td>
                </tr>
			</table>     	
    	</form>
	</div>
</div>

flex : 숫자 는 비율을 뜻함

3개의 div에 1을 선언하므로써 1:1:1 똑같은 비율로 정렬

 

반응형에서 사용하기 좋은 css속성인듯~

 

<결과화면>

참고문서

 

flex - CSS: Cascading Style Sheets | MDN

flex CSS 속성은 하나의 플렉스 아이템이 자신의 컨테이너가 차지하는 공간에 맞추기 위해 크기를 키우거나 줄이는 방법을 설정하는 속성입니다.

developer.mozilla.org

 

반응형

Q1) 성능 데이터 모델링에 대한 설명

   A) 데이터의 증가가 빠를수록 성능저하에 따른 성능개선 비용은 증가한다.

       데이터모델은 성능을 튜닝하면서 변경이 될 수 있는 특징이 있다.

       분석/설계 단계에서 성능을 고려한 데이터모델링을 수행할 경우 성능저하에 따른 Rework비용을 최소화 할 수 있는

      기회를 가지게 된다. 

Q2) 성능을 고려한 데이터모델링의 순서로 가장 적절한 것은?

   가. 데이터 모델링을 할 때 정규화를 정확하게 수행한다.

   나. 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.

   다. 데이터베이스 용량산정을 수행한다.

   라. 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.

   마. 성능관점에서 데이터 모델을 검증한다.

   바. 이력모델의 조정, PK/FK조정, 슈퍼타입/서브타입 조정 등을 수행한다.

 

  A) 가-다-라-나-바-마

 

Q3) 성능데이터 모델링을 할때 고려사항으로 가장 부적절한 것은?

  A) 데이터 모델링의 정규화는 항상 조회 성능저하를 나타내므로 -> 조회 성능향상

 

 


Q1) 아래의 ERD에서 3차 정규화를 만족하게 할 때 엔터티의 개수는 몇개가 되는가?

    ㄱ. 평가코드 평가내역은 학번에 종속적

    ㄴ. 코스명 기간은 코스코드에 종속적

    ㄷ. 평가코드 평가내역은 속성간 종속적 관계

   

A) 3개

2차 정규화는 학과등록과 코스테이블로 엔터티 2개

3차 정규화를 하므로써 학과등록, 코스, 평가항복 테이블로 나누어 엔터터 3개

 

Q2) 아래의 데이터 모델처럼 동일한 유형의 속성이 칼럼 단위로 반복되느느 경우가 실제 프로젝트를 하면서 많이 발생 할 수 있다. 다음 중 아래와 같이 전제조건이 있을 때 테이블에서 나타날 수 있는 현상

 

 

전제조건 : 유형기능분류코드에 해당하는 속성들은 분포도가 양호하며, SQL Where 절에서 각각의 값이 상수값으로 조건 입력 될 수 있는 특징을 가진다. 

 

 

 

 

 

A) 유형기능분류코드 각각에 대하여 개별로 Index를 모두 생성할 경우 입력,수정,삭제 때 성능이 저하되므로 제 1차 정규화를 수행한 후 인덱스를 적용하는 것이 좋다.  -> 컬럼에 의한 반복적이 속성값을 갖는형태는 1차 정규화

 

Q3) '일자별매각물건' 엔터티에 대한 설명으로 가장 적절한 것은?

A) 2차 정규화가 필요한 엔터티로서 매각기일과 일자별매각물건으로 1:M 관계가 될 수 있다.

   -> 두개의 주식별자 속성 중 매각일자에만 종속되기 때문

Q4) 아래와 같이 수강지도 엔터티를 만들었을 때 이에 해당하는 정규형과 정규형의 대상으로 가장 바르게 짝지어진 것은?

 

함수종속성

 1. 학번||과목 -> 성적

 2. 학번 -> 지도교수명

 3. 학번 -> 학과명 

 

  A) 1차정규형 - 2차 정규화 대상


Q1) 아래의 설명 중 반정규화 대상이 아닌 것은?

   A) 자주 사용하는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우

       테이블의 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면

       성능을 보장할 수 없을 경우

       통계성 프로세스에 의해 통계 정보를 필요로 할때 별도의 통계 테이블을 생성해야 하는경우

       테이블에 지나치게 많은 조인과 Sorting, Order by 프로세스가 많은경우   -> 지나치게 많은 join은 맞지만

                                                                                                          Sorting과 Order by는 무관

 

 

Q2) 반정규화에 대한 설명

  A) 데이터를 조회할 때 디스크 I/O 량이 많아서 성능이 저하되거나 경로가 너무멀어 조인으로 인한 성능저하가

      예상될 때 수행한다.

      컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 수행한다.

      반정규화를 적용할 때는 기본적으로 데이터 무결성이 깨질 가능성이 많이 있으므로 반드시 데이터 무결성을                보장할 수 있는 방법을 고려해야 한다.

      통계테이블, 중복테이블, 이력테이블 추가는 반정규화 기법이다.

      

Q3) 아래 설명을 읽고 다음 (ㄱ) 에 들어갈 단어를 작성하시오

  첫번째, 데이터 모델링을 할 때 정규화를 정확하게 수행한다.

  두번째, 데이터베이스 용량산정을 수행한다.

  세번째, 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.

  네번째, 용량과 트랜잭션의 유형에 따라 (  ㄱ  ) 을 수행한다.

  다섯번째, 이력모델의 조정, PK/FK조정, 슈퍼타입/서브타입 조정 등을 수행한다.

 

  A) 반정규화

 

Q4) 하나의 테이블의 전체 칼럼 중 자주 이용하는 집중화된 컬럼들이 있을 때 디스크 I/O 를 줄이기 위해 해당 컬럼들을 별도로 모아 놓는 반정규화 기법은?

  A) 테이블 추가 - 부분테이블 추가

 

Q5) 데이터 모델에 대한 반정규화를 고려할 때 판단요소에 대한 설명으로 가장 적절한 것은?

  A) 반정규화 정보에 대한 재현의 적시성으로 판단한다. 예를 들어, 빌링의 잔액은 다수 테이블에 대한 다량의 조인이 불가피하므로 데이터 제공의 적시성 확보를 위한 필수 반정규화 대상 정보이다.

 

Q6) SQL문에서 조회를 빠르게 수행하기 위한 반정규화 방법은?

SELECT A.주문번호, SUM(C.단가)

FROM 주문 A, 주문목록 B, 제품 C

WHERE A.주문번호 = '2015-02-001'

AND A.주문번호 B. 주문번호

                                                              AND B.제품번호 = C.제품번호

                                                              GROUP BY A.주문번호

 

  A) 주문 엔터티에 단가를 합한 계산된 컬럼을 추가하도록 한다. 

     -> 제품 엔터티에 단가를 주문번호별로 합하는 것은 해당 제품이 여러주문에 포함될수 있으므로 안됨

         주문목록 엔터티에 주문번호별 단가 합계금액을 추가하는 것은 일관성 문제 발생

 

 


Q1) Row Migration과 Row Chaining에 대한 설명

   A) 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두개 이상의 블록에 걸쳐 하나의 로우가 저장되는 현상을 Row Chaning이라고 한다. 

 

Q2) 아래 설명에서 데이터 엑세스 성능을 향상시키기 위해 적용하는 방법에 대해서 (  ㄱ  ) 을 채우시오

    하나의 테이블에 많은 양의 데이터가 저장되면 인덱스를 추가하고 테이블을 몇개로 쪼개도 성능이 저하되는 경우가 있다. 이때 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의테이블로 분리하여 데이터 엑세스 성능도 향상시키고, 데이터 관리방법도 개선할 수 있도록 테이블에 적용하는 기법을 (   ㄱ  ) 이라고 한다. 

 

  A) 파티셔닝

 

Q3) 다음 중 논리데이터모델의 슈퍼타입과 서브타입 모델을 물리적인 테이블 형식으로 변환할때 설명

  A) 트랜잭션은 항상 전체를 대상으로 일괄 처리하는데 테이블은 서브타입별로 개별 유지하는 것으로 변환하면 Union       연산에 의해 성능이 저하될 수 있다. 

     트랜잭션은 항상 서브타입 개별로 처리하는데 테이블은 하나로 통합하여 변환하면 불필요하게 많은 양의 데이터가       직접되어 있어 성능이 저하 될 수 있다.

     트랜잭션은 항상 슈퍼+서브 타입을 함께 처리하는 데 개별로 유지하면 조인에 의해 성능이 저하될 수 있다.

     트랜잭션은 항상 전체를 통합하여 분석처리하는데 하나로 통합되어 있으면 데이터 집접으로 인해 성능이 더 우수하       다.(조인 감소)

 

Q4) '현금출급기실적' 테이블과 이 테이블에서 데이터를 조회 할 때 사용되는 아래의 SQL 패턴에 대한 설명

 

SELECT 건수, 금액 

FROM 현금출급기실적

WHERE 거래일자 BETWEEN '20140701' AND '20140702' 

AND 사무소코드 = '000368'

 

(단 , PK인덱스는 설계된 순서 그대로 생성함)

 

  A) 사무소코드가 '=' 상수값이 들어왔고, 거래일자가 범위 'Between'으로 들어왔기 때문에 PK순서를 사무소코드 + 거래일자 + 출급기번호+명세표번호로 바꾸고 인덱스를 생성하는 것이 성능에 유리함.

    -> 인덱스로 구성되어 있을 때 앞쪽에 위치한 속성의 값이 비교자로 있어야 인덱스가 좋은 효율을 나타낼 수 있다. 

        앞쪽에 위치한 속성 값이 가급적 '=' 아니면 최소한 범위 'between', '<>' 가 들어와야 인덱스를 이용할 수 있다.


Q1) 분산 데이터베이스의 특징 중 사용하려는 데이터의 저장 장소 명시가 불필요하다는 특징은?

   A) 위치 투명성

 

Q2) 다음 중 데이터가 여러 지역에 분산되어 있지만 하나의 데이터베이스처럼 사용하기를 원하는 분산데이터베이스 환경에서 데이터베이스 분산설계를 적용하여 효율성을 증대시킬 수 없는 것은?

  A) 공통코드, 기준정보 등 마스터 데이터는 분산데이터베이스에 복제분산을 적용한다. 

      거의 실시간 업무적인 특성을 가지고 있을 때 분산 데이터베이스를 사용하여 구성할 수 있다.

      백업 사이트르 구성 할때 간단하게 분산기능을 적용하여 구성할 수 있다.

      Global Single Instatnce(GSI) 를 구성할 때 분산데이터베이스를 활용하여 구성하는 것이 효율적이다.

      > 통합데이터베이스 구조를 의미

반응형

- 성능데이터 모델링의 정의

  성능데이터 모델링이란 데이터베이스 성능향상을 목적으로 설계단계의 데이터 모델링 때부터 정규화, 비정규화, 테이블통합, 테이블분할, 조인구조, PK, FK 등 여러가지 성능과 관련된 사항이 데이터 모델링에 반영 될 수 있도록 하는 것이다. 

 

  성능이 저하되는 데이터 모델의 경우 첫번째, 데이터 모델구조에 의해 성능이 저하될 수도 있고 두번째, 데이터가 대용량이 됨으로써 불가피하게 저하될 수도 있음. 세번째, 인텍스 특성을 충분히 고려하지못하고 생성하여 성능저하되는 경우도 있음

 

- 성능 데이터 모델링 수행시점

  성능분석/설계 단계에서부터 성능에 대한 데이터 설계를 하지 않으면 시간이 지날수록 성능개선의 비용이 증가함.

 

- 성능 데이터 모델링 고려사항

  1. 데이터 모델링을 할 때 정규화를 정확하게 수행한다.

  2. 데이터베이스 용량산정을 수행한다.

  3. 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.

  4. 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.

  5. 이력모델의 조정, PK/FK의 조정, 슈퍼타입/서브타입 조정등을 수행한다.

  6. 성능관점에서 데이터 모델을 검증한다.

 

- 정규화를 통한 성능 향상 전략

  데이터 모델링을 하면서 정규화를 하는 것은 기본적으로 데이터에 대한 중복성을 제거하여 주고 데이터가 관심사별로 처리되는 경우가 많기 때문에 성능이 향상되는 특징을 가지고 있음

  정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것

  일반적으로 정규화를 수행해야 데이터 처리의 성능이 향상되며 데이터의 조회처리 트랜잭션시에 성능저하가 나타날 수 있음 

  일반적으로 정규화가 잘되어 있으면 입력/수정/삭제의 성능이 향상되고 반정규화를 많이 하면 조회의 성능이 향상된다고 인식 됨

 

[정규형 정리]

1차 정규형 모든 속성은 반드시 하나의 값을 가진다. 즉, 반복형태가 있어서는 안된다. -> 속성값의 중복제거
2차 정규형 식별자가 아닌 모든 속성들은 식별자 전체 속성에 완전 종속되어야 한다. -> 식별자에 종속되지 않는 속성의 중복제거
3차 정규형 2차 정규형을 만족하고 식별자를 제외한 나머지 속성들 간의 종속이 존재하면 안된다.
나머지 속성들간의 종속적 관계가 있으면 3차정규화 대상임

 

  - 반정규화된 테이블의 성능저하 사례1

    하나의 테이블을 부분키 종속을 정규화하여 두개의 테이블로 분리해 2차 정규화 시켰을 때 두개의 테이블을 조인해서 처리 

   아래의 경우 왼쪽테이블은 불필요하게 납부자 번호만큼 누적된 데이터를 읽어서 결과를 구분하여 보여주고 오른쪽테이블은 관서수만큼만 존재하는 데이터를 읽어 처리하기 때문에 2차정규화를 한 테이블이 훨씬 빠르다.

출처 : sqld 전문가가이드

  - 반정규화된 테이블의 성능저하 사례2

  두 개의 엔터티가 통합되어 반정규화 된 경우

  특정 매각장소에 대해 매각일자를 찾아 매각내역을 조회하려면 100만건의 데이터를 읽어 매각일자를 distinct 하여

  매각일자별 매각내역과 JOIN

  복합식별자 중에서 일반속성이 주식별자 속성 중 일부에만 종속관계를 가지고 있으므로 2차 정규화 대상이 된다.

  2차 정규화를 적용하여 매각일자를 pk로 하고 특정매각내역을 조회하려면 5천건의 매각기일과 매각일자별매각내역이

  JOIN되어 성능 향상

  - 반정규화된 테이블의 성능저하 사례3

   동일한 속성 형식을 두개 이상의 속성으로 나열하여 반정규화 한 경우

   아래의 경우 인덱스를 생성하려면 9개나 되는 인덱스를 추가해야 함

  중복 속성에 대한 분리가 필요하므로 1차 정규화를 적용

  - 반정규화된 테이블의 성능저하 사례4

- 함수적 종속성에 근거한 정규화 수행 필요

   함수의 종속성(Functional Dependency) : 데이터들이 어떤 기준값에 의해 종속되는 형상

   기준값- 결정자(Determinant) , 종속되는 값 - 종속자(Dependent)

   함수의 종속성은 데이터가 가지고 있는 근본적이 속성으로 인식되어짐

   ex) 이름,출생지, 주소는 주민등록번호에 함수 종속성을 가지고 있음

   기본적으로 데이터는 속성간의 함수종속성에 근거하여 정규화 되어야한다. 

   프로젝트 수행에서 정규화는 선택사항이 아니라 필수 사항이다. 

 

- 반정규화를 통한 성능 향상 전략

 1) 반정규화의 정의 

    정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법

 

 2) 반정규화의 적용방법

  반정규화를 적용할 때는 기본적으로 데이터 무결성이 깨질 가능성이 많이 있기 때문에 반드시 데이터 무결성을 보장할 수 있는 방법을 고려한 이후에 반정규화를 적용하도록 해야 한다. 

  · 반정규화의 대상을 조사한다.

    데이터가 대량이고 성능이 저하될 것으로 예상이 되면 다음 4가지 경우를 고려하여 반정규화를 고려하게 된다.

     1. 자주 사용되는 테이블에 접근(Access)하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우에 반정규화

        를 검토한다.

     2. 테이블에 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면

        성능을 보장할 수 없을 경우에 반정규화를 검토한다.

     3. 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계테이블(반정규화 테이블)을 생성한다.

     4.  테이블에 지나치게 많은 조인(JOIN)이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 반정규화를 검토

        한다.

   ·  반정규화의 대상에 대해 다른 방법으로 처리 할 수 있는지 검토한다.

     1. 지나치게 많은 조인(JOIN)이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 뷰(VIEW)를 사용하면

        이를 해결할 수도 있다.

     2. 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우에 클러스터링을 적용하거나 인덱스를 조정함으로써

        성능을 향상시킬 수 있다.

     3. 대량의 데이터는 Primary Key 의 성격에 따라 부분적인 테이블로 분리할 수 있다. 즉 파티셔닝 기법(Partitioning)

       이 적용되어 성능저하를 방지할 수 있다.

     4. 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있다. 

   · 반정규화를 적용한다.

 

- 반정규화의 기법

   1)테이블 반정규화

기법분류 기법 내용
테이블 병합 1:1 관계 테이블 병합 1: 1 관계를 통합하여 성능향상
1:M 관계 테이블 병합 1: M 관계를 통합하여 성능향상
슈퍼 / 서브타입 테이블 병합 슈퍼/서브 관계를 통합하여 성능향상
테이블 분할 수직분할 컬럼단위의 테이블을 디스크 I/O를 분산처리 하기 위해 테이블을 1:1로 분리하여 성능향상(트랜잭션의 처리되는 유형파악이 선행)
수평분할 로우 단위의 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상하기 위해 로우단위로 테이블을 쪼갬
테이블추가 중복테이블 추가 다른 업무이거나 서버가 다른 경우 동일한 테이블구조를 중복하여 원격조인을 제거하여 성능을 향상
통계테이블 추가 SUM,AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상
이력테이블 추가 이력테이블 중에는 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재하는 방법은 반정규화의 유형
부분테이블 추가 하나의 테이블의 전체 칼럼 중 자주 이용하는 집중회된 칼럼들이 있을때 디스크 I/O 를 줄이기 위해 해당 칼럼들을 모아놓은 별도의 반정규화 된 테이블을 생성

   2)칼럼 반정규화

반정규화 기법 내용
중복칼럼 추가 조인에 의해 처리할 때 성능저하를 예방하기 위해 즉, 조인을 감소시키기 위해 중복된 칼럼을 위치시킴
파생칼럼 추가 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 에방하기 위해 미리 값을 계산하여 칼럼에 보관함 , Derived Column
이력테이블 컬럼 추가 대량의 이력데이터를 처리 할때 불특정 날 조회나 최근값을 조회할 때 나타날 수 있는 성능저하를 에방하기 위해 이력테이블에 기능성 컬럼(최근값 여부, 시작과 종료일자 등)을 추가
PK에 의한 칼럼 추가 복합의미를 갖는 PK를 단일속성으로 구성하였을 경우발생됨, 단일 PK안에서 특정값을 별도로 조회하는 경우 성능저하가 발생될 수있음, 
이때 이미 PK안에 데이터가 존재하지만 성능향상을 위해 일반속성으로 포함하는 방법이 PK에 의한 컬럼추가 반정규화임
응용시스템 오작동을 위한 칼럼 추가 사용자가 데이터처리를 하다가 잘못 처리하여 원래값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법, 컬럼으로 이것을 보관하는것은 임시적기법

   3)관계 반정규화

반정규화 기법 내용
중복관계 추가 데이터를 처리하기 위한 여러경로를 거쳐 조인이 가능하지만 이 때 발생할 수 있는 성능저하를 예방하기 위하여 추가적인 관계를 맺는 방법

 

테이블과 칼럼의 반정규화는 데이터 무결성에 영향을 미치게 되나 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터 처리의 성능을 향상 시킬 수 있는 반정규화 기법이 된다. 

 

 

- 정규화가 잘 정의된 데이터 모델에서 성능이 저하된 경우

  1)

공금자와 전화번호, 메일주소, 위치는 1:M 관계이므로 한명의 공급자당 여러개의 전화번호, 메일주소, 위치가 존재하므로 최근에 변경된 값을 가져오려면 각 테이블에서 MAX값을 가져와서 조인해야하므로 복잡한 SQL문을 작성

이때 반정규화를 적용하면 가장 최근에 변경 된 값을 마스터에 위치 시켜서 간단하게 SQL문을 작성할 수 있다. 

2) 데이터베이스서버가 분리 되어 분산데이터베이스가 구성되어 있을 때 반정규화를 통해 성능을 향상시킬수 있는 경우

 서버 A 에 부서와 접수 테이블이 있고 서버 B 에 연계라는 테이블이 있는데 서버 B에서 데이터를 조회 할 때 빈번하게   조회되는 부서번호가 서버 A 에 존재하기 때문에 연계, 접수, 부서 테이블이 모두 조인이 걸리게 된다. 게다가 분산데이터베이스 환경이기 때문에 다른 서버간에도 조인이 걸리게 되어 성능이 저하됨

  이때는 서버 A에 있는 부서테이블의 부서명을 서버 B의 연계테이블에 부서명으로 속성 반정규화를 함으로써 조회 성능을 향상시킬 수 있다.

- 대량 데이터에 따른 테이블 분할 개요

  대량의 데이터가 존재하는 테이블에 많은 트랜잭션이 발생하여 성능이 저하되는 테이블 구조에 대해 수평(칼럼단위) /수직(로우단위) 분할 설계를 통해 성능저하를 예방 할 수 있음

  ex) 한 테이블에 데이터가 대량으로 집중되거나 하나의 테이블에 여러 개의 칼럼이 존재하여 디스크에 많은 블록을 점유하는 경우는 모두 I/O량이 증가하면서 성능저하를 유발

   · 로우체이닝 : 로우 길이가 너무 길어서 데이터 블록하나에 데이터가 모두 저장되지 않고 두 개 이상의 블록에 걸쳐         하나의 로우가 저장되어 있는 형태

   · 로우마이그레이션 : 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터블록에서 저장하지 못하고 다른       블록의 빈 공간을 찾아 저장하는 방식

 

- 한 테이블에 많은 수의 칼럼을 가지고 있는 경우

  트랜잭션이 발생 될때 어떤 컬럼에 대해 집중적으로 발생하는지 분석하여 테이블을 쪼개어 주면 디스크 I/O가 감소하게 되어 성능이 개선됨

도서정보테이블에서 200개의 컬럼을 동시에 조회하던 경우를 전자출판유형에 대한 트랜잭션이 독립적으로 많이 발생되는 경우가 있으므로 도서전자출발테이블을 생성하여 1:1 관계로 분리

 

- 대랑 데이터 저장 및 처리로 인해 성능

  테이블에 많은 양의 데이터가 예상될 경우 파티셔닝을 적용하거나 PK에 의해 테이블을 분할하는 방법을 적용할 수

  있다

 

  1) RANGE PARTITION 적용

    대상 테이블이 날짜 또는 숫자값으로 분리가 가능하고 각 영역별로 트랜잭션이 분리된다면 Range Partition을 적용.

     또한 데이터보관주기에 따라 테이블에 데이터를 쉽게 지우는 것이 가능하므로(파티션 테이블 DROP)  데이터보관         주기에 따른 테이블관리가 용이

    ex) PK 가 요금일자+ 요금번호로 구성되어 있는 대용량테이블의 경우(데이터건수 1억2천만건) PK인 요금일자의

        년+월을 이용해 12개의 파티션 테이블(각 파티션 테이블당 평균 1000만건의 데이터) 을 만듦,

       그러면 SQL 문장을 처리 할 때는 마치 하나의 테이블처럼 보이는 요금 테이블을 이용하여 처리하면 되지만

       DBMS 내부적으로는 SQL WHERE 절에 비교된 요금일자에 의해 각 파티션에 있는 정보를 찾아가므로

       1000만건의 데이터에서 찾으면 되므로 성능이 개선

 

  2) LIST PARITTION 적용

     PK가 지점, 사업소, 사업장, 핵심적인 코드값 등으로 구성되어 있고 대량의 데이터가 있는 테이블이라면 값 각각에

     의해 파티셔닝이 되는 List Partition을 적용 할 수 있다. List Partition은 대용량 데이터를 특정값에 따라 분리 저장할       수는 있으나 Range Partition과 같이 데이터 보관주기에 따라 쉽게 삭제하는 기능은 제공 될 수 없다. 

    ex) 고객테이블에서 지역을 나타내는 사업소코드별로 고객_인천, 고객_서울 등등 List Partition을 적용하여 성능개선 

 

  3) HASH PARTITON 적용

    HASH 조건에 따라 해쉬 알고리즘이 적용되어 테이블이 분리되며 설계자는 테이블에 정확하게 어떻게 들어갔는지 알 수 없고 데이터 보관주기에 따라 쉽게 삭제하는 기능은 제공할 수 없다. 

 

- 테이블에 대한 수평분할/ 수직분할의 절차

  1) 데이터 모델링을 완성한다.

  2) 데이터베이스 용량산정을 한다. (칼럼수가많은지 확인)

  3) 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석한다.

    (트랜잭션 특성에 따라 테이블을 1:1 형태로 분리할 수 있는 지 검증)

  4) 칼럼 단위로 집중화된 처리가 발생하는지, 로우단위로 집중화된 처리가 발생하는지 분석하여 집중화된 단위로

     테이블을 분리하는 것을 검토한다. 

 

- 슈퍼타입/서브타입 모델의 성능고려 방법

  · 슈퍼/서브타입 데이터 모델의 개요

   공통의 부분을 슈퍼타입으로 모델링하고 공통으로부터 상속받아 다른 엔터티와 차이가 있는 속성에 대해서는 별도의     서브엔터티로 구분하여 업무의 모습을 정확하게 표현하면서 물리적인 데이터 모델로 변환을 할 때 선택의 폭을 넓힐     수 있는 장점이 있다. 

   논리적인 데이터 모델에서 이용되는 형태이고 분석/설계 단계를 구분하자면, 분석단계에서 많이 쓰이는 모델이다.

   그러므로 물리적인 데이터 모델이 성능을 고려한 데이터 모델이 되어야한다는 점을 고려해야한다. 

 

  · 슈퍼/서브타입 데이터 모델의 변환 

   1) 트랜잭션은 항상 일괄로 처리하는데 테이블은 개별로 유지되어 Union 연산에 의해 성능이 저하될 수 있다. 

   2) 트랜잭션은 항상 서브타입 개별로 처리하는데 테이블은 하나로 통합되어 있어 불필요하게 많은 양의 데이터가 집약되어 있어 성능이 저하되는 경우가 있다.

   3) 트랜잭션은 항상 슈퍼+서브 타입을 공통으로 처리하는데 개별로 유지되어 있거나 하나의 테이블로 집약되어 성능이 저하되는 경우가 있다.

   그러므로 슈퍼/서브 타입을 성능을 고려한 물리적인 모델로 변환하는 기준은 데이터 양과 해당테이블에 발생되는 트랜잭션의 유형에 따라 결정된다. 

 

  · 슈퍼/서브타입 데이터 모델의 변환기술 

   데이터량이 많이 존재하고 지속적으로 증가하는 양도 많다면 슈퍼타입/ 서브타입에 대해 물리적인 모델로 변환하는 세가지 유형에 대해 세심하게 적용해야함 

   1) 개별로 발생되는 트랜잭션에 대해서는 개별 테이블로 구성

      슈퍼타입에도 꼭 필요한 속성만을 가지게 하고 서브타입에도 꼭 필요한 속성 및 자신이 타입에 맞는 데이터만 가지게 하기 위해서 모두 분리하여 1:1관계를 갖게함

      ex) 공통으로 처리하는 슈퍼타입테이블인 당사자정보를 미리조회 하고 원하는 내용을 클릭하면 거기에 따라서 서브타입인 세부적인 정보를 조회하는 방식

   2) 슈퍼타입+서브타입에 대해 발생도는 트랜잭션에 대해서는 슈퍼타입+서브타입 테이블로 구성

   3) 전체를 하나로 묶어 트랜잭션이 발생할 때는 하나의 테이블로 구성

 

  · 슈퍼/서브타입 데이터 모델의 변환타입 비교

   변환모델의 선택은 철저하게 데이터베이스에 발생되는 트랜잭션의 유형에 따라 선택을 해야한다. 

구분 OneToOne Type Plus Type Single Type
특징 개별테이블 유지 슈퍼+서브타입 테이블 하나의 테이블
확장성 우수함 보통 나쁨
조인성능 나쁨 나쁨 우수함
I/O량 성능 좋음 좋음 나쁨
관리용이성 좋지않음 좋지않음 좋음(1개)
트랜잭션 유형에 따른 선택방법 개별 테이블로 접근이 많은 경우 선택 슈퍼+서브 형식으로 데이터를 처리하는 경우 선택 전체를 일괄적으로 처리하는 경우 선택

- 인덱스 특성을 고려한 PK/FK 데이터베이스 성능향상

  · PK/FK 컬럼순서와 성능개요

  · PK 컬럼의 순서를 조정하지 않으면 성능의 저하 이유  

  · PK 순서를 잘못 지정하여 성능이 저하된 경우 - 간단한 오류

  · PK 순서를 잘못 지정하여 성능이 저하된 경우 - 복잡한 오류

 

- 물리적인 테이블에 FK제약이 걸려있지 않을 경우 인덱스 미생성으로 성능저하

  물리적인 테이블에 FK를 사용하지 않아도 데이터 모델관계에 의해 상속받은 FK속성들은 SQL WHERE 절에서 조인으로 이용되는 경우가 많이 있으므로 FK인덱스를 생성해야 성능이 좋은 경우가 빈번하다. 

  ex) FK 인덱스 미생성으로 FULL TABLE SCAN 발생하여 성능저하 -> FK인덱스 생성으로 INDEX SCAN발생하여 성능향상 ( 개발초기에는 데이터량이 얼마 되지 않아 성능저하가 나타나지 않지만 대용량일 경우)

 

- 분산 데이터베이스의 개요

  데이터베이스를 연결하는 빠른 네트워크 환경을 이용하여 데이터베이스를 여러 지역 여러 노드로 위치시켜

  사용성/성능 등을 극대화 시킨 데이터베이스

 

- 분산 데이터베이스의 투명성(Transparency)

   분산데이터베이스가 되기 위해서는 6가지 투명성을 만족해야 한다. 

   1) 분할 투명성(단편화) : 하나의 논리적 Relation이 여러 단편으로 분할 되어 각 단편의 사본이 여러 site에 저장 

   2) 위치 투명성 : 사용하려는 데이터의 저장 장소 명시 불필요, 위치정보가 System Catalog에 유지되어야 함

   3) 지역사상 투명성 : 지역 DBMS 와 물리적 DB사이의 Mapping 보장, 각 지역시스템 이름과 무관한 이름 사용가능

   4) 중복 투명성 : DB객체가 여러 site에 중복 되어 있는지 알 필요가 없는 성질

   5) 장애 투명성 : 구성요소(DBMS) 의 장애에 무관한 Transaction의 원자성 유지

   6) 병행 투명성 : 다수 Transaction 동시 수행 시 결과의 일관성 유지, Time Stamp, 분산 2단계 Loking을 이용구현

 

- 분산 데이터 베이스의 적용 방법 및 장단점

   · 분산 데이터 베이스 적용 방법

    업무의 흐름을 보고 업무구성에 따른 아키텍처 특징에 따라 데이터베이스를 구성하는 것

 

   · 분산 데이터 베이스 장단점

장점 단점
 - 지역 자치성, 검증적 시스템 용량 확장
 - 신뢰성과 가용성
 - 효용성과 융통성
 - 빠른 응답 속도와 통신비용 절감
 - 데이터의 가용성과 신뢰성 증가
 - 시스템 규모의 적절한 조절
 - 각 지역 사용자의 요구 수용 증대
- 소프트위어 개발 비용
- 오류의 잠재성 증대
- 처리 비용의 증대
- 설계, 관리의 복잡성과 비용
- 뷸규칙한 응답 속도
- 통제의 어려움
- 데이터 무결성에 대한 위협

- 데이터베이스 분산구성의 가치

  핵심가치 : 데이터 처리 성능,

                데이터를 분산 환경으로 구성하면 통합된 데이터베이스에서 제공할 수 없는 빠른 성능을 제공

 

- 분산 데이터베이스의 적용기법

  1) 테이블 위치 분산

     테이블의 위치는 변하지 않고 테이블이 다른 데이터베이스에 중복되어 생성되지도 않음, 다만 설계된 테이블의 위치

     를 각각 다르게 위치시킴

     ex) 자재품목은 본사에서 구입하여 관리하고 각 지사별로 자재품목을 이용하여 제품을 생산한다면 데이터베이스를

         본사와 지사단위로 분산, 각각 테이블마다 위치를 표기하여 테이블 생성 (자재품목 - 본사 , 생산제품-지사 )

    테이블별 위치 분산은 정보를 이용하는 형태가 각 위치별로 차이가 있을 경우에 이용

  2) 테이블 분할(Frgmentation) 분산

    단순히 위치만 다른 곳에 두는 것이 아니라 각각의 테이블을 쪼개어 분산하는 방법이다.  첫번째는 테이블의 로우(ROW) 단위로 분리하는 수평분할, 두번째는 테이블을 칼럼(COLUMN) 단위로 분할하는 수직분할이 있다.

    ·수평 분할 : 데이터를 수정할 때는 타 지사에 있는 데이터를 원칙적으로 수정하지 않고 자신의 데이터에 대해서

                    수정하도록 한다.

                    데이터가 지사별로 별도로 존재하므로 중복은 발생하지 않는다.

                    한 시점에는 한 지사(Node)에서 하나의 데이터만이 존재하므로 데이터의 무결성은 보장되는 형태이다.

    ·수직 분할 : 칼럼을 기준으로 분할하였기 때문에 각각의 테이블에는 동일한 Primary Key 구조와 값을 가지고 있어야

                    한다.

                    지사별로 쪼개어진 테이블들을 조합하면 Primary Key 가 동일한 데이터의 조합이 가능해야 하며 하나의

                   완전한 테이블이 구성되어야 한다.

                   데이터를 한군데 집합시켜 놓아도 동일한 Primary Key 는 하나로 표현하면 되므로 데이터 중복은

                   발생되지 않는다.   -> 사례가 드물다

  3) 테이블 복제(Replication) 분산

    동일한 테이블을 다른 지역이나 서버에서 동시에 생성하여 관리하는 유형

    부분복제 : 통합된 테이블을 한군데(본사)에 가지고 있으면서 각 지사별로는 지사에 해당된 로우를 가지고 있는 형태

    광역복제 : 통합된 테이블을 본사에 가지고 있으면서 각 지사에 본사와 동일한 데이터를 모두 가지고 있는 형태

  4) 테이블 요약(Summarization) 분산

    지역간에 또는 서버 간에 데이터가 비슷하지만 서로 다른 유형으로 존재하는 경우

    분석요약 : 각 지사별로 존재하는 요약정보를 본사에 통합하여 다시 전체에 대해서 요약정보를 산출하는 분산방법

    통합요약 : 각 지사별로 존재하는 다른 내용의 정보를 본사에 통합하여 다시 전체에 대해서 요약정보를 산출하는

                  분산방법

 

- 분산 데이터베이스를 적용하여 성능이 향상된 사례

  · 성능이 중요한 사이트에 적용해야 한다.

  · 공통코드, 기준정보, 마스터 데이터 등에 대해 분산환경을 구성하면 성능이 좋아진다.  

  · 실시간 동기화가 요구되지 않을 때 좋다. 거의 실시간(Near Real Time)의 업무적인 특징을 가지고 있을 때도

    분산 환경을 구성할 수 있다.

  · 특정 서버에 부하가 집중이 될 때 부하를 분산할 때도 좋다.  

  · 백업 사이트(Disaster Recovery Site)를 구성할 때 간단하게 분산기능을 적용하여 구성할 수 있다

반응형

Q1) 데이터 모델링에 대한 설명 

  A)  논리모델링의 외래키는 물리모델에서 반드시 구현되지는 않는다.

      실제로 데이터베이스를 구축할 때 참고되는 모델은 물리적 데이터 모델링이다.

      개념 모델링에서 물리 모델링으로 가면서 더 구체적이며 개념모델링이 가장 추상적이다.

      데이터 모델링의 3가지 요소는 Thing, Attributes, Relationship 이다.

      

Q2) 데이터 모델링에 대한 단계 중 아래에서 설명하는 단계는 어떤 단계의 모델링인가?

    추상화 수준이 높고 업무중심적이고 포괄적인 수준의 모델링 진행. 전사적 데이터 모델링, EA 수립 시 많이 이용됨 

  A) 개념적 데이터 모델링

 

Q3) 데이터 모델링이 최종적으로 완료된 상태라고 정의할 수 있는, 즉 물리적인 스키마 설계를 하기 전 단계를 가리키는 말은 ?

  A) 논리적 모델링

 

Q4) 모델링의 특징 

  A) 현실세계를 일정한 형식에 맞추어 표현하는 추상화의 의미를 가질 수 있음

      복잡한 현실을 제한된 언어나 표기법을 통해 이해하기 쉽게 하는 단순화의 의미를 지니고 있음

      애매모호함을 배제하고 누구나 이해가 가능하도록 정확하게 현상을 기술하는 정확화의 의미를 가짐

 

Q5) 데이터모델링을 할 때 유의해야 할 사항

  A)  여러 장소의 데이터베이스에 같은 정보를 저장하지 않도록 하여 중복성을 최소화한다. 

       데이터의 정의를 데이터의 사용 프로세스와 분리하여 유연성을 높인다.

       데이터간의 상호연관관계를 명확하게 정의하여 일관성 있게 데이터가 유지되도록 한다. 

 

Q6) 다음 아래 설명이 의미하는 데이터 모델링의 유의점에 해당하는 특성은?

     데이터의 정의를 데이터의 사용 프로세스와 분리함으로써 데이터 모델링은 데이터 혹은 프로세스의 작은 변화가

     애플리케이션과 데이터베이스에 중대한 변화를 일으킬 수 있는 가능성을 줄인다. 

   A) 비유연성

 

Q7) 아래 내용이 설명하는 스키마 구조로 가장 적절한 것은?

  - 모든 사용자 관점을 통합한 조직 전체 관점의 통합적 표현

  - 모든 응용시스템들이나 사용자들이 필요로 하는 데이터를 통합한 조직 전체의 DB를 기술한 것으로  DB에 저장되는 데이터와 그들간의 관계를 표현하는 스키마

  A) 개념스키마

 

Q8) 정보 시스템을 모델링 할때 세가지 관점

   A) 업무가 어떤 데이터와 관련이 있는지 분석(WHAT)

       업무가 실제하는 일은 무엇인지 또는 무엇을 해야하는지 분석(HOW, PROCESS)

       업무가 처리하는 일의 방법에 따라 데이터가 어떻게 영향을 받는지 분석(INTERACTION)

 

Q9) 발생시점에 따라 구분할 수 있는 엔터티의 유형

  A) 기본/키 엔터티, 중심엔터티, 행위엔터티

      개념엔티티는 유형에 따른 분류

 

 


Q1) 엔터티 - 인스턴스 - 속성 - 속성값에 대한 관계 설명

  A) 한 개의 엔터티는 두 개 이상의 인스턴스의 집합이어야 한다.

      한 개의 엔터티는 두개 이상의 속성을 갖는다.

      하나의 속성은 하나의 속성값을 가지며 하나 이상의 속성값을 가지는 경우 정규화가 필요함

      하나의 엔터티의 인스턴스는 다른 엔터티의 인스턴스간의 관계인 Paring을 가진다.

 

Q2) 엔터티의 종류가 아닌것

   A) 교수, 학생, 수강 

       -> 엔터티는 사람, 장소, 물건, 사건, 개념 등의 명사에 해당한다.

           엔터티는 업무상 관리가 필요한 관심사에 해당한다.

           엔터티는 저장이 되기 위한 어떤 것(Thing)이다.

       청약자   -> 관심사라기 보다 청약의 주체가 되는 속성에 가까우므로 속성값을 가지기에 애매함

 

Q3) 발생시점에 따른 엔터티 분류에 의한 중심 엔터티

  A) 매출, 계약, 주문  (사원  -> 기본엔터티)

 

Q4)  발생시점에 따른 엔터티 분류에 대해서 짝짓기

  A) 기본/키 엔터티 : 조직, 사원

      기본/키 엔터티 : 부서

      중심 엔터티 : 주문상품, 상품 -> 상품은 기본 엔터티 

      행위 엔터티 : 주문내역, 계약진행

 

Q5) 아래 설명이 나타내는 데이터모델의 개념으로 적절한 것은?

  주문이라는 엔터티가 있을 때 단가라는 속성 값의 범위는 100에서 10,000 사이의 실수 값이며 제품명이라는 속성은

  길이가 20자리 이내의 문자열로 정의할 수 있다.

  A) 도메인 

 

Q6) 다른 엔터티로부터 주식별자를 상속받지 않고 자신의 고유한 주식별자를 가지며 사원,부서,고객,상품,자재 등이 예가 될 수 있는 엔터티는?

   A) 기본 엔터티(키엔터티)

 

Q7) 두 개의 엔터티 사이에서 관계를 도출 할 때 체크할 사항

   A) 두 개의 엔터티 사이에 관심있는 연관규칙이 존재하는가?

       두 개의 엔터티 사이에 정보의 조합이 발생되는가?

       업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는가?

       업무기술서, 장표에 관계연결을 가능하게 하는 동사(Verb)가 있는가?


Q1) 업무에서 필요로 하는 인스턴스에서 관리하고자 하는 의미상 더 이상 분리되지 않는 최소의 데이터 단위를 무엇이라고 하는가?

   A) 속성

 

Q2) 속성에 대한 설명

   A) 엔터티에 대한 자세하고 구체적인 정보를 나타낸다.

       하나의 엔터티는 두 개 이상의 속성을 갖는다.

       하나의 인스턴스에서 각각의 속성은 한개의 속성값을 갖는다( 하나이상의 속성값을 가질 수 없다)

       속성도 집합이다.

 

Q3) 이 속성이 없어도 다른 속성을 이용하여 결과를 도출 할 수 있는 특징을 가진 속성의 이름은?

   A) 파생 속성

 

Q4) 데이터를 조회할 때 빠른 성능을 낼 수 있도록 하기위해 원래 속성의 값을 계산하여 저장 할 수 있도록 만든 속성으로 가장 적절한 것은?

   A) 파생 속성

 

Q5) 엔터티 내에서 속성에 대한 데이터 타입과 크기 그리고 제약사항을 지정하는 것

  A) 도메인

 


Q1) 데이터모델링의 관계에 대한 설명

   A) 관계는 존재에 의한 관계와 행위에 의한 관계로 구분 될 수 있으나 ERD에서는 관계를 연결 할 때 존재와 행위를 구분하지 않고 단일화된 표기법을 사용한다. 

      UML에는 클래스 다이어그램의 관계 중 연관관계와 의존관계가 있고 이것은 실선과 점선의 표기법으로 다르게 표현이 된다. 

 

Q2) 관계에 대한 설명으로 부적절 한것은?

   A) 관계는 존재적 관계와 행위에 의한 관계로 나누어 볼 수 있다. 

       관계의 표기법은 관계명, 관계차수, 식별성  선택성의 3가지 개념을 사용한다. 

       부서와 사원 엔터티 간의 '소속' 관계는 존재적 관계의 사례이다. 

       주문과 배송 엔터티 간의 '배송근거'는 행위에 대한 관계의 사례이다. 

 


Q1) 식별자의 대체여부에 따라 분류하는 방식은?

     A) 본질식별자 - 인조식별자

 

Q2)  주식별자를 지정할 때 고려해야 할 사항은?

   A ) 주식별자에 의해 엔터티 내의 모든 인스턴스들이 유일하게 구분되어야 한다.

        주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 한다.

        지정된 주식별자의 값은 자주 변하지 않는 것이여야 한다.

        주식별자가 지정이 되면 반드시 값이 들어와야 한다.

 

Q3) 사원엔터티에서 식별자의 특성에 해당하는것은

   A) 주식별자, 단일식별자, 내부식별자, 본직식별자

 Q4) 식별자로 가장 부적절한 것은

   A) 주식별자가 이름인 경우 -> 명칭, 내역등과 같이 이름으로 기술되는 것들은 주식별자로 지정하기에 부적절하다.

                                         특히 사람의 이름은 동명이인이 있을수 있기 때문에 주식별자로서 더더욱 부적절하다. 

 

Q5) 비식별자 관계로 연결하는 것을 고려해야 하는 경우로 부적절한 것은?

  A) 부모 엔터티에 참조값이 없어도 자식 엔터티의 인스턴스가 생성될 수 있는 경우

      부모엔터티의 인스턴스가 자식 엔터티와 같이 소멸되는 경우    -> 식별자 관계

      (비식별자 관계인 경우 자식엔터티만 남겨두고 부모가 소멸되는 경우도 있음)

      여러 개의 엔터티를 하나로 통합하면서 각각의 엔터티가 갖고 있던 여러개의 개별 관계가 통합되는 경우

      자식 쪽 엔터티의 주식별자를 부모엔터티와는 별도로 생성하는 것이 더 유리하다고 판단하는 경우

 

Q6) 식별자의 분류체계에 대한 설명

  A) 대표성 여부에 따라 분류도는 주식별자와 보조식별자에서 주식별자는 대표성을 가지며 참조관계 연결을 할수있다.

      스스로 생성여부에 따라 분류되는 식별자는 내부 식별자와 외부식별자이다

      둘 이상의 속성으로 구성된 식별자를 복합식별자라 하며 속성의 수에 따른 식별자 분류이다.

      업무적으로 만들어 지지 않지만 필요에 따라 인위적으로 만든 식별자를 인조식별자라 한다. 

+ Recent posts