생성시 설정
CREATE DATABASE createDatabaseName DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
수정
ALTER DATABASE databaseName DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
생성시 설정
CREATE DATABASE createDatabaseName DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
수정
ALTER DATABASE databaseName DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Illegal mix of collations
컬럼 CHARACTER이 안맞아서 발생한다.
컬럼 캐릭터셋이 다른데 조인 걸어 조회쿼리를 실행 했을때 발생한다.
utf8_unicode_ci 와 utf8_grneral_ci 로 각각 다른 캐릭터셋 이었다.
암꺼나 같은 걸로 변경해주면 해결 끝!.
포린키 생성 실패
메시지 내용
2017-10-20 14:53:53 c8ca8b70 Error in foreign key constraint of table CYBER_EDU_MUSEUM_UPDATE/#sql-532_1dca:
FOREIGN KEY (`DSPY_SIL_CODE`, `PART_NO`) REFERENCES `JNT_DSPY_PART` (`DSPY_SIL_CODE`, `PART_NO`):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
내가 찾아봐서 해결한 방법은
컬럼에 utf8_unicode_ci , utf8_general_ci 두개를 참조 컬럼과 외래키 컬럼의 콜렉션타입을 다르게 해서 였다.
각각의 테이블 키 컬럼의 타입과 참조 컬럼의 타입을 같게 아무거나 맞춰주니 포린키 생성 성공했다.
utf8_general_ci 에는 악센트 문자가 없어서 엑센트 없는문자로만 나온다네요.
utf8_general_ci로 해야 속도가 빠르다고는 한다.
제일 중요한건 한가지 타입으로 맞춰주는거.
Key Entity
Main Entity
Action Entity
Production Entity
이력은 선분이고 현재의 순간은 점이므로 선분이다.
과거에 비해 현저하게 오랜 기간을 관리해야 한다는 것은 결코 함부로 결정 해서는 안된다.
모든 업무는 언제 시작해서 언제 끝났는지에 과한 정보가 기록되어 있다.
예)주민등록증의 뒷면 주소변경란은 이사를 가서 주소 이력 정보가 기입된다.
예)환율
이력을 관리한다는것은 관리하지 안을때와 비교해서 많은 비용이 들어간다.
이력의 관리 필요성 검증을 거쳐야한다.
어떤 데이터가 발생할 때마다 이력 정보를 남겨야만 한다면 이력은 발생 이력이라고 본다.
(이벤트가 발생할때에만 이력데이터를 발생하는 방법이 있고, 이력이 발생하지 않더라도 날마다 데이터를 생성하는 경우도 있다.)
데이터가 변경될 때마다 변경 전과 후의 차이를 확인해야 한다면 변경 이력을 남길 수 있다.
업무의 진행에 따라 이데이터를 이력 정보로 남겨야만 하는 경우.
가장 대표적인 것이 바로 주문과 같은 업무처리.(구매신청->입금완료->배송준비중->배송중->배송완료,주문취소)각 업무처리 단계가 언제 누구에 의해서 처리되고, 현단계는 무엇인지에 관한 정보가 필요한 경우.
시점이력 : 데이터의 변경이 발생한 시각만을 관리 (특점 시점의 데이터를 추출하고자 할 경우에 불필요한 작업(모두읽어 MAX를 구함)을 수행하게 된다.)
선분이력 : 데이터 변경의 시작 시점부터 그 상태의 종료 시점까지 관리
선분이력을 관리하는 엔터티의 UID를 확정하는 것은 향후에 테이블로 만들어지고 사용될 때의 성능 측면도 고려되야한다.
실제 데이터는 유니크하지만 의미적으로 유니크하지 않은 일이 발생한다. 이러한 부분의 의미적인 유니크를 검증할 수 있는 조치를 병행해야한다.
선분 이력에서 종료점 처리시 주의사항
종료점이 미정이므로 NULL : 논리적으로 타당하지만 비교가 불가능, 인덱스를 하용하지 못하므로 수행속도 저하
수렴하므로 최대치 부여 : 아직 종료되지 않았으므로 무한히 계속되는 것으로 간주, 최대치 부여(9999/12/31), 테이블생성시 기본값 부여, 수행속도에 유리.
※ 이력 데이터 관리 방법을 하나로 획일화 하는것은 옳지 않음
※ 엔터티의 성격과 요건, 중요도에 맞춰 다양한 방법이 사용되어야 함
※ 요건에 가장 합당한 방법을 채택할 수 있는 힘 필요
하나의 엔터티 | 두 개의 엔터티 |
---|---|
![]() | ![]() |
하위 엔터티를 가질 수 없음 (확장성X) | 속성 추가시 두 엔터티 및 두개 프로그램 수정 필요 |
하위 엔터티가 존재할 수 없는 모델 (나쁜사례) |
---|
![]() |
가정 : 주문 내용의 변경된 데이터를 주문 엔터티에서 관리 하고, 변경은 하루에 한번만 가능 |
#주문번호 | #변경일자 | #배송처 |
---|---|---|
100 | 2019-05-05 | 서울시 |
#주문번호 | #변경일자 | #상품코드 | 주문수량 |
---|---|---|---|
100 | 2019-05-05 | 1010 | 1 |
100 | 2019-05-05 | 1020 | 3 |
100 | 2019-05-05 | 1050 | 2 |
#주문번호 | #변경일자 | #배송처 |
---|---|---|
100 | 2019-05-05 | 서울시 |
100 | 2019-05-06 | 경기도 |
#주문번호 | #변경일자 | #상품코드 | 주문수량 |
---|---|---|---|
100 | 2019-05-05 | 1010 | 1 |
100 | 2019-05-05 | 1020 | 3 |
100 | 2019-05-05 | 1050 | 2 |
#주문번호 | #변경일자 | #상품코드 | 주문수량 |
---|---|---|---|
100 | 2019-05-06 | 1010 | 1 |
100 | 2019-05-06 | 1020 | 3 |
100 | 2019-05-06 | 1050 | 2 |
#주문번호 | #변경일자 | #상품코드 | 주문수량 |
---|---|---|---|
100 | 2019-05-05 | 1010 | 1 |
100 | 2019-05-05 | 1020 | 3 |
100 | 2019-05-05 | 1050 | 2 |
100 | 2019-05-06 | 1010 | 1 |
100 | 2019-05-06 | 1020 | 3 |
100 | 2019-05-06 | 1050 | 2 |
※ 두개 모두 바람직 하지 않음, 하위 엔터티(주문상품)를 돌아다니면서 해당 인스턴스를 변경/추가 하는것은 한계가 있음
※ 하위 엔터티가 존재할 때는 하나의 엔터티에서 변경 데이터를 같이 관리하면 안됨
주문 이력 엔터티 (좋은사례) |
---|
![]() |
#주문번호 | #변경일자 | #배송처 |
---|---|---|
100 | 2019-05-07 | 대전시 |
101 | 2019-05-08 | 서울시 |
#주문번호 | #변경일자 | #배송처 |
---|---|---|
100 | 2019-05-05 | 서울시 |
100 | 2019-05-06 | 경기도 |
#주문번호 | #상품코드 | 주문수량 |
---|---|---|
100 | 1010 | 1 |
100 | 1020 | 3 |
100 | 1050 | 2 |
101 | 1010 | 2 |
현재+과거 엔터티 |
---|
![]() |
현재와 과거 데이터를 별도로 관리하는 모델 |
---|
![]() |
선분 이력이 아닌 엔터티 |
---|
![]() |
![]() |
변경순번 속성을 사용한 이력 엔터티 |
---|
![]() |
스냅샷 방식의 이력 관리 모델 |
---|
![]() |
두 개의 엔터티에서 현재와 과거 데이터를 분리해 관리하는 기본 모델, 현재[보험계약] / 과거[보험계약이력] |
#증권번호 | 상품코드 | 보험가입일자 | 보험가입금액 |
---|---|---|---|
12345 | A10 | 2020-01-01 | 1200 |
23456 | B20 | 2020-05-04 | 500 |
#증권번호 | #유효시작일자 | 유효종료일자 | 상품코드 | 보험가입일자 | 보험가입금액 |
---|---|---|---|---|---|
12345 | 2020-01-01 | 2020-10-09 | A00 | 2020-01-01 | 1000 |
#증권번호 | 상품코드 | 보험가입일자 | 보험가입금액 |
---|---|---|---|
12345 | A10 | 2020-01-01 | 1200 |
23456 | B20 | 2020-05-04 | 500 |
#증권번호 | #유효시작일자 | 유효종료일자 | 상품코드 | 보험가입일자 | 보험가입금액 |
---|---|---|---|---|---|
12345 | 2020-10-10 | 9999-12-31 | A10 | 2020-01-01 | 1200 |
12345 | 2020-01-01 | 2020-10-09 | A00 | 2020-01-01 | 1000 |
23456 | 2020-05-04 | 9999-12-31 | B20 | 2020-05-04 | 500 |
예제1 | ![]() | 슈퍼타입과 서브타입을 합친 인스턴스별로 이력데이터 관리(서브타입 개념 반영, 연결된 인스턴스 조회 편리) |
예제2 | ![]() | 슈퍼타입과 서브타입별 각각의 이력 데이터 관리(이력 데이터 발생 쉽고, 공간 절약) |
계좌비밀번호 속성의 이력 엔터티 |
---|
![]() |
계좌비밀번호 변경 내역 엔터티 |
---|
![]() |
여러 유형의 계좌비밀번호 발생 내역 |
---|
![]() |
여러 유형의 계좌비밀번호의 발생 내역과 변경 이력 |
---|
![]() |
관계(역할) 이력 관리 모델 |
---|
![]() |
추출 속성을 사용한 관계(역할) 이력 관리 모델 |
---|
![]() |
현재와 과거 관리사원을 별도로 관리하는 모델 |
---|
![]() |
여러 역할을 관리하는 모델 |
---|
![]() |
여러 역할을 관리하는 모델에 추출 속성을 적용한 모델 |
---|
![]() |
#속성코드 | 속성명 |
---|---|
100 | 계좌명 |
110 | 계좌관리사원번호 |
120 | 계좌비밀번호 |
#계좌번호 | #속성코드 | #시작일자 | 종료일자 | 속성값 |
---|---|---|---|---|
12345678 | 110 | 2021-05-05 | 2021-07-06 | 홍길동 |
12345678 | 110 | 2021-07-07 | 2021-12-30 | 김길동 |
변경 속성을 코드로 관리하는 모델 |
---|
![]() |
이전 속성 값을 관리하는 모델 |
---|
![]() |
동시에 변경된 속성을 관리하는 모델 |
---|
![]() |
#속성코드 | 속성명 |
---|---|
100 | 계좌명 |
110 | 계좌관리사원번호 |
120 | 계좌비밀번호 |
#계좌번호 | #변경순번 | #속성코드 | 변경일자 | 속성값 |
---|---|---|---|---|
12345678 | 3 | 110 | 2021-07-07 | 123 |
12345678 | 3 | 120 | 2021-07-07 | 2222 |
12345678 | 2 | 100 | 2021-05-05 | 홍길동 |
12345678 | 1 | 120 | 2021-02-10 | 1111 |
유사한 속성을 묶어서 이력 관리하는 모델 |
---|
![]() |
구분 | 인스턴스(스냅샷)/하나의 엔터티 | 인스턴스(스냅샷)/두 개의 엔터티 | 속성(개별)/이력 속성 엔터티 | 속성(개별)/코드성 엔터티 | 속성그룹 |
---|---|---|---|---|---|
이력 데이터 발생 용이성 | Good | Good | Good | Bad | Normal |
변경 속성 조회 용이성 | Bad | Bad | Good | Good | Bad |
이력 모델 형상 관리 | Good | Bad | Good | Good | Normal |
하위 엔터티 확장성 | Bad | Good | Good | Good | Good |
전체 데이터(스냅샷) 조회 | Good | Good | Bad | Bad | Normal |
모델의 유연성(확장성) | Bad | Normal | Good | Good | Normal |
데이터 중복성 | Bad | Bad | Good | Good | Normal |
데이터 중복성 | Bad | Bad | Good | Good | Normal |
엔터티 성격 명확성 | Bad | Bad | Good | Bad | Normal |
데이터 저장 공간 효율성 | Bad | Bad | Good | Good | Normal |
엔티티 식별 : 엔티티자격조건, 엔티티주식별자 임시부여
엔티티 배열 :
키엔티티는 외곽,
메인엔티티는 업무수행순서에 따라 상에서 하로, 좌에서 우로
액션엔티티는 키엔티티 최 좌우 측에 또는 메인 엔티티 최 좌우 측에 배치
관계정의 : 관계명, 슈퍼-서브타입관계 식별
기수성 식별
선택성 식별 (
다대다일때 교차실체 사용하여 일대다로 분리
속성의 정의
함수정 종속성에 의해 해당하는 엔티티에 배치, 추출속성은 배제
정규화 검토
1차정규화 : 중복/반복
2차정규화 : 2개 이상 구성된 복합식별자의 ...
3차정규화
속성의 특징 -
속성도 일종의 집합
릴레이션도 일종의 속성
속성들 간은 서로 독립적
속성들은 반드시 식별자에 종속 : 제2정규형
속성들간에 종속은 없어야함 : 제3 정규형
속성은 발견과 창조로 도출
주변 속성들로부터 연관되는 속성들을 유추하여 도출
속성의 정의
속성의 검증기준
최소 단위로 분할
유일 값 존재 검증
가공값 유무판정 : 추출속성 (단가 * 수량 = 금액) , 단가와 수량은 기초속성 , 금액은 추출속성
설계속성( 코드등 전산을 위해서 만든 속성)
- 논리 데이터 모델에서는 추출속성은 작성하지 않는게 원칙임.
정규화
이상 현상을 야기하는 속성간의 종속관계를 제거하기 위해 엔티티를 작은 여러 엔티티로 무손실 분해하는 과정 , DB 설계 최적화 과정.
정규화 단계별 규칙을 사용하여 속성의 위치를 적절히 하는것
정규화의 목적 : 반복 배제, 질의에 대한 응답시간을 향상
비정규릴레이션 -> 1차정규형 -> 2차정규형 -> 3차정규형 -> Boyce-Codd 정규형( BCNF) -> 4차정규형 -> 5차정규형
이력관리
점이력, 선분이력
점이력
- 로그성 데이터로 이력을 쌓아두고자 할 경우[ 임의 시점에 대한 조회 요구사항이 있음]
- 이력데이터를 저장하고 이해하기에는 용이하지만 활용상에서 비효율이 많이 나타남
- 과거 임의의 시점에서의 이력을 재현하기에 비효율이 많이 발생
선분이력
- 이력관리 대상 속성들이 의미하는 정보가 일정 시점의 정보만을 나타내는 것이 아니라 일정 기간 동안 해당 정보가 유효하다는 의미
- 임의의 시점의 데이터를 찾고자 하는 요구가 있는 경우에 유용
- 과거 임의의 시점에서의 이력을 재현하고 활용하는데 매우 효율적임
이력관리유형
ROW_LEVEL 이력관리 ( 변경일자별 수수료율 등)
COLUMN_LEVEL 이력관리 (계좌비밀번호 이력 등)
SUBJECT_LEVEL 이력관리 ( 엔티티구분, 속성 구분 을 나누어 별도로 관리, 이력엔티티, 이력속성)
엔티티관계 정의
관계의 의미
관계는 정의된 기호를 사용하여 두엔티티 간에 존재하는 업무적 연관성을 표현하는 것으로, 방법론에 따라 표현 방법은 다소 다르지만 표현하고자 하는 내용은 대동소이함.
관계 표현을 통해 두 엔티티 간에 존재하는 업무 규칙을 정의
관리하고자 하는 업무 영역내의 임의의 두 엔티티 간에 존재할 수 있는 수 많은 관계 중에서 특별히 관리하고자하는 직접적인 관계가 관계로서 의미를 가짐
관계의 의미를 정확하게 이해하고 표현할 수 있어야만 데이터 모델링을 통한 정확한 업무 정의가 가능
부정확한 관계 표현이나 관계가 아예존재하지 않는 데이터 모델은 데이터에 대한 업무 규칙이 제대로 파악되지 않았음을 의미하며, 이러한 모델에 기반하여 구축된 시스템은 본인의 목적달성이 불가능하고 막대한 유지보수 비용을 발생시키며, 쓸모없는 데이터만 양산하게 됨.
관계 정의의 의의
집합 간의 업무적 연관성을 관계명과 기호로서 규명
검토 및 정의 결과를 기획
추후 상세화 및 변경에 대한 베이스라인
이해관계자 간 정확한 의사소통
적절한 관계 정의는 관련 현업 업무를 효율화할 수 있음.
이해 관계자 간의 업무 중복이나 혼선을 조정하기에 용이하고 그 결과를 명확하게 기호로 표현함으로써 관련자 모두가 쉽게 공유하고 업무에 활용이 가능함
Many to One(M:1) , Many to Many(M:M) , One to One(1:1)
관계 정의를 통해 이 집합들에 대해 어떤 업무가 이루어지고 있고, 집합 간의 관계들을 추적하여 데이터 발생 경로와 어떤 경로를 거쳐 데이터가 어떻게 변화하고 진화하는지를 알 수 있어 업무와 데이터의 흐름을 명확하게 이해할 수 있음.
관계가 정의되지 않은 엔티티들 간에는 직접적인 연관성이 없음 -> 데이터 발생의 원천을 알 수 없음(어디서온 데이터인지 확인이 불가능함)
잘 못 그리면 엔티티의 의미나 업무의 내용이 달라질 수 있음
관계 명을 누락하면 애매모호한 관계가 되어버림
서브 타입
SUPER-TYPE이란 SUB-TYPE을 가지는 ENTITY
SUPER-TYPE은 두 개 이상의 독립적인 SUB-TYPE으로 구성
SUPER-TYPE은 각 SUB-TYPE들의 공통적인 attribute와 relationship 보유
SUB-TYPE은 자신이 attribute나 독립적인 relationship을 가진다.
자신의 attribute나 relationship을 가지지 않은 SUB-TYPE도 존재 할 수 있으나 이런 경우는 일반적인 attribute로 처리하는 것이 좋다 (차별성)
SUPER-TYPE의 모든 instance는 SUB-TYPE중 단 하나와 반드시 연결
SUB-TYPE은 서로 중첩되지 않아야 하며 그 전체집합은 SUPER-TYPE과 1:1
전체집합에 확신이 없다면 ‘기타’ 구분을 생성
SUPER-TYPE과 SUB-TYPE은 결코 부모 : 자식 관계가 아니다(동일 Level)
서브타입 배타적 관계
어떤 ENTITY가 두개 이상의 다른 Entity의 합집합과 relationship을 가지는 것을 배타적(Exclusive)관계 혹은 아크(Arc)관계라고 함.
아크(Arc)내에 있는 Relationship은 보통 함.(기수성)
배타적 관계는 항상 Mandatory 이거나 Optional이어야 함.
배타적 관계는 반드시 하나의 Entity에만 속해야 함. (하나의 아크가 여러 Entity를 가질 수 없음)
어떤 Enitty는 다수의 아크를 가질 수 있음.그러나 지정된 Relationship은 단 하나의 아크에만 사용되어야 함.
은행계좌 : 개인 , 법인
입출고 : 공정, 창고
엔티티 정의
엔티티 후보 수집
보고서
현업에서 작성한 보고서에는 많은 데이터 집합들이 숨어 있음.
인터뷰
후보선정 시부터 현업담당자와 같이 하는 것은 최선, 보고서에 없는 데이터 식별
후보 엔티티 선정시 유의사항
엔티티 가능성이 있다고 예상되면 일단 검토 대상에 포함
너무 깊게 생각하지 말고 엔티티 자격 유무만 판단 할 것
비슷한 동의어(동음이의어, 이음동의어)가 있더라도 함부로 버리지 말것
엔티티 후보 식별
현재 관리하고 있는가? 앞으로는 관리해야 하지 않는가
의미상의 주어를 찾아라!
개체 구분(유형)을 명확히 하라! ( 메인, 키, 액션)
어떤 경우마다 새로운 개체가 생기는가?
엔티티 후보의 검증 : 집합의 면적(서브타입), 순수성, 독립성
Key Entity (시조, 줄기)
태초부터 창조된 실체
잘 변하지 않는 것
데이터를 발생의 주체나 목적어
자신의 부모를 갖지 아니함
사원, 부서, 상품, 자재
Main Entity(원조 , 굶은 가지)
부모로부터 태어난 실체지만 하위에 자손을 거느린 실체
많은 자손을 가짐
데이터를 발생시키는 주체
카드, 단가, 계약, 공사
Action Entity(자손, 잔가지)
실제 발생하는 업무
반드시 부모를 가짐
많은 부모를 가짐
자주 변경, 지속적 증가
카드이용, 계약변경, 공사내역
http://cyber.dbguide.net/
2012 대한민국 DA설계 공모대전 문제풀이 동영상 내용을 정리한 내용이다.
window mysql 5.6
my.ini 파일에 하단 내용 추가
lower_case_table_names = 0 // 테이블 생성 및 조회 시 대·소문자 구분한다.
lower_case_table_names = 1 // 입력 값이 대·소문자든 소문자로 인식 소문자 인식 파일 생성
lower_case_table_names = 2 // 윈도우에서 대·소문자를 구분해서 테이블생성
리눅스와 유닉스의 경우 0, 윈도우의 경우 1, 맥키토시의 경우 2 가 기본 값