생계/DA2023. 12. 27. 17:49

그간 여러 사이트를 다니고 나서 느낀 모델링에 대한 개인적인 소회, 생각들 한번 정리해보자.

 

- 튜닝에 비해 바로 효과 나타나지 않아 중요해 보이지 않는다. 

한때 좋은 모델과 데이터의 품질에 대해서 신경을 쓰려던 트렌드가 잠깐 생겼었는데 조금은 뜸해진 느낌

튜닝은 바로 효과가 나타나고 비용과 즉시 연결이 된다. 클라우드의 시대가 오면서 더 확고해졌다. 

온프레미스에선 성능 개선으로 자원사용륭이 낮아졌다고 해서 서버를 낮은 스펙으로 바꾸지 않는다. 

이미 구매를 한 서버니 그럴일이 없다. 어느 정도 이상의 튜닝은 굳이 할 필요가 없다. 

하지만 클라우드에서는 서버의 스펙다운이 자유롭다. 튜너를 투입해서 얻은 성능개선이 운영비 절감을 가시적으로 할수있게 되었다. 

 

- 통합 관점의 표준은 개별적이고 독립적으로 개발하는 MSA 트렌드와 상충

물론 완전히 하나를 버리고 하나를 택하는 극단적인 상황까지 가는 것은 아니지만 통합 관점의 표준과 데이터의 중복도 허용하지 않는 기존의 방식을 계속 고수하려면 갈등이 발생한다. 

 

- 잘못된 모델은 시간이 한참 지나고 나서야 비싼 청구서를 부과한다. 

물리모델은 dbms 의 특성을 반영할수 밖에 없는데 최근에 mysql 로 환경이 많이 바뀌면서 이 특성을 잘 고려해야한다. 

오라클은 인덱스를 통해 데이터를 찾아갈때 인덱스의 리프노드에서 데이터의 rowid 를 찍어서 바로 원하는 데이터를 찾아갈수 있지만 mysql 은 조금 방식이 다르다.

mysql 의 innodb 테이블에서는 pk 가 클러스터링 되어 저장이 되는데, 세컨더리 인덱스에서 rowid 를 찍는것이 아니라 pk 를 찍어준다. 그래서 pk 가 여러 칼럼으로 구성되면 인덱스의 크기가 커지고 성능상 불리함이 있다. 

그래서 mysql 은 단순하게 일련번호로 pk 를 만드는 오라클의 모델링에서는 참을수 없는 방식으로 가이드를 한다.

다만 이때도 업무식별자를 도출해 유니크 인덱스를 만들 필요가 있다.

일련번호로 식별자를 만들때의 단점은 어떤 규칙으로 데이터가 만들어지는지 파악하기 힘들다는 것에 있다. 

심한경우 운영환경에서 여러사람을 거친 경우 나중에는 특정 테이블을 잘못 사용하고 있거나 무슨 테이블인지 모르겠다고 해서 비슷한 새로운 테이블을 또 만드는 경우가 생기게 된다. 



- 틀린 모델로 운영이 가능하다 .


안타까운 사실은 모델이 틀려도 어떻게든 운영을 한다는 것이다. 물론 내눈에 보이지 않는 누군가의 노력이 있었겠지만. 

좋은 모델을 만들고 유지하려면 비용을 지불해야 하지만 당장의 우선순위에서 밀리다 보니 고객은 이쪽에 더 돈을 지불할 의사를 보이지 않는듯한 느낌이다. 

반응형

'생계 > DA' 카테고리의 다른 글

자기참조 모델 순환관계 모델 에 대한 이해  (0) 2025.01.10
데이터 모델링 식별자 선정  (0) 2024.10.09
RDBMS 에서의 관계 라는 것  (0) 2023.12.12
이력 모델  (0) 2023.12.09
엔터티 통합과 분리  (0) 2023.12.09
Posted by 돌고래트레이너
생계/DA2023. 12. 12. 17:43

1. 관계의 의미

우리가 많이 사용하는 RDBMS 의 'R' 은 Relational 이라는 관계형을 의미한다. 
데이터를 테이블형태로 구조화 하여 사용하는 것이 특징이고, 테이블과 테이블에는 관계라는 것을 설정할수있다
관계라는 것은 내가 어디에서 왔는가를 의미한다. 조인과는 다른 개념이다. 
나와 1촌인 부모-자식 에만 관심이 있고, 할아버지-손자 의 관계는 관심이 없다. 
부모없는 자식, 아버지와 할아버지가 같은 모델은 잘못된 모델이다.   

2. 관계의 구현

데이터모델링에서 관계라는 것은 논리적인 표현이고, 결국 관계란 자식의 컬럼으로 표현되며, 
물리적으로 이를 구현한 형태가 외래키 (FK) 이다. 

요즘은 참조 제약조건을 DBMS 단의 FK 로 구현하지 않는 추세인데, 이유는 아래정도가 있다.

- 개발 편의성
 이관작업시 데이터 선후 관계를 고려해야함.
 ogg는 데이터간의 관계를 따지지 않기때문에 일시적 오류 가능성
- lock 의 전이, 데드락 발생 가능성
 
정말 필수적인 테이블에만 일부 FK를 생성해서 운영하곤 한다. 
dbms 단에서 제약조건을 처리하지 않는것이지, 아예 참조제약조건을 무시하는 것이 아니다. 
application 레벨에서 참조 제약조건을 수행하는 로직을 추가해야 한다.  

논리모델에서는 관계를 표현해야 하지만 물리모델에서 FK 를 생성하는 가는 전략적 문제이다. 
다만 FK 를 생성하지 않으니 논리모델에서 관계를 생략하는 것은 덜 완성된 모델이다. 

* 관계가 생략될수 있는 경우
 - 기준엔터티
  환율엔터티의 경우, 
 - 가공엔터티
  
 - 외부엔터티 
  외부의 시스템의 참조하는 경우
   

3. 속성과 관계 누락
속성은 있지만 관계가 안그려진것 -> 속성을 보고 관계가 누락된것을 발견할수 있으니 불행 중 다행
속성표현X, 관계는 그려진 경우 -> 존재하지 않음
관계없는데 관계가 그려진 경우 


4. 식별/비식별 관계 

관계는 부모의 식별자를 물려받는 것. 
이때 부모의 식별자가 자식의 식별자에 포함이 되면 식별관계가 되고, 부모-자식 간 강한 종속성이 나타남. (부모없는 자식x)
반면, 부모의 식별자가 자식의 일반속성으로 가게되면 부모-자식간의 약한 종속성이 나타나고 부모와 독립적으로 존재할수 있다.

* 유의 사항 
- 부모의 일부만 물려받지 않는다. 
- 부모의 속성을 물려받지 않는다. 


6. 관계의 단절 필요성

조상이 많은 경우 계속해서 식별관계로 그릴경우 식별자가 비대해진다.
이런 모델에서 조인을 걸 경우 SQL 이 복잡해지는 단점이 있다.
이때 인조식별자를 만들어 비식별 관계로 만드는 것을 고려한다.
자식이 많을 경우에도 고려할수 있다. 

반응형

'생계 > DA' 카테고리의 다른 글

데이터 모델링 식별자 선정  (0) 2024.10.09
모델링에 대한 생각  (0) 2023.12.27
이력 모델  (0) 2023.12.09
엔터티 통합과 분리  (0) 2023.12.09
엔터티 유형 분류  (0) 2023.11.29
Posted by 돌고래트레이너
생계/DA2023. 12. 9. 21:49



1. 이력모델 개념

데이터 모델링에서 '이력', '이력데이터' 는 많이 사용되는 용어 인데 그 개념이 모호하거나 
이력이 아닌것을 이력이라고 부르는 등 이치에 맞지 않게 사용되는 경우가 종종 보인다. 

어느 글에서 이력은 '시간에 따라 발생하는 데이터 형식' 이라고 정의한 것을 보았는데, 
이것은 일반적인 트랜잭션과도 차이점이 없다. 

주문과 같은 일반적인 트랜잭션을 '발생내역' 이라고 한다면 변경된 속성값을 일자에 따라 관리하는 "이력" 을 '변경이력' 이라고 구별 할 수 있다. 
변경이력을 다시 정의하면 현재 유효하지 않은 과거 데이터 라고 할수 있다. 
이력모델 이라고 부를수 있는것은 '변경이력' 이고, 원천모델이 나오고 나서야 이력모델이 도출되는 것이다. 
즉, 원천모델이 없는데 이력엔터티라고 부르고 있다면 엔터티의 정의를 다시 한번 살펴볼 필요가 있다. 


2. 발생내역 vs 변경이력 

- 발생내역(트랜잭션)
  insert 의 형태 (ex. 주문, 접속ip로그..)
  pk변경, 데이터변경 

- 변경내역 (찐 이력)
  update & insert 형태 (ex. 비밀번호변경 이력)
  pk동일, 데이터변경 
 
ex) 개인경력 엔터티가 있다면..
사번
일자
소속
경력상세 
=> 시간에 따른 경력쌓인 것(발생내역)

    과거의 경력데이터가 변경된 경우(변경내역 발생) -> 변경전 데이터를 관리할거면 이력엔터티 도출, 아니면 업데이트하고 완료


3. 이력엔터티와 원천엔터티 분리 or 통합

- 분리가 원칙 
엔터티 순수성이 유지 되어야 확장이 가능 -> 원천모델이 자식엔터티가 있다면 분리가 원칙 
잘못된 데이터 하나가 전체 엔터티의 데이터 신뢰도를 떨어트림 

이력+원천 통합 모델의 자식은 일자속성은 상속되지 않는 이상한 케이스 발생 => '$'


- 통합하는 경우 
업무적으로 이력/원천데이터가 빈번히 같이 사용된다면 한곳에 사용할수도 있다 
=> 원천에 일시 속성이 추가되어 사용하는것. 성능적 관점. 반정규화 일종 

이력+원천을 통합해서 쓴다면 해당 엔터티의 이름은 '~이력' 이라고 쓰지 않는다. 
오직 이력데이터만 있는 엔터티에게만 ~이력 이라고 명명한다. 


4. 이력관리 모델 형태/유형

- 이력관리 유형(레벨)
 1) 엔터티 레벨 (스냅샷)
   *장: 변경 시점의 다른 속성 값 파악 쉽다, 설계가 쉽다. 
   *단: 공간낭비, 어떤속성이 변경되었는지 1row 만 가지고 알수없다
   원천 형상 바뀌면 이력도 변경 해줘야 함
   자식이 있다면 스냅샷 

 2) 속성 레벨
   *장: 공간 절약, 무엇이 변경된 속성인지 파악 쉽다, 원천형상에 독립적 => 컬럼추가 필요 X
   *단: 변경시점의 다른속성값 알기 어려워. 원천테이블의 이력요건 속성이 추가되면 비효율 증가 

* 추가적 방식(vertical) 
 - 종(vertical)테이블 방식
    
 - 통합이력 
   *장: 업무변경에 유연하다
   *단: 구조가 데이터가 되어 파악 쉽지않다 

 3) 속성그룹 레벨
   같이사용되는 속성들 묶어서 관리 
   *장: 비교적 공간 절약, 
  
* 원천이 종속이면 이력도 종속 
 
 
- 이력관리 형태 
  1) 점이력 
변경시점만 관리 
특정시점의 값 찾기 어려움 

ex)   
SELECT A.기관코드, A.기관거래등급
  FROM 기관정보 A, 
     ( SELECT 기관코드, MAX(적용일자)
 FROM 기관정보 
WHERE 적용일자 <='20080701'
GROUP BY 기관코드 
  )B
 WHERE A.기관코드 = B.기관코드 
   AND A.적용일자 = B.적용일자 
;   

  2) 선분이력
시작시점/종료시점 관리 
특정시점의 값 찾는 것에 유리 

SELECT 기관코드, A.기관거래등급
 FROM 기관정보 A
WHERE '20081201' BETWEEN 시작일자 AND 종료일자 
;

선분이라는 것은 시작점, 끝점이 이어진 2차원 형태인데 현재의 RDB 에서는 이를 구현할수 없다
(xmltype 도 있는데 선분타입이라는 것을 못만들 이유는 없을것 같다)
편의상 시작점, 끝점을 속성으로 만들어 선분을 구현했으나(흉내냈으나) unique 제약조건 등을 걸수가 없다.
이력에서 사용하는 선분은 겹치는 지점없이 이어져야(unique 해야) 하지만 이를 DB에선 표현 못함.
겹치거나 누락되는 지점이 발생되는것을 제약조건 등으로 막을수 없다. 
 
 * 선분이력 모델의 자식 => 상속되지 않는 시작/종료일자 속성(엔코아에서는 이를 $로 표현)
 pk에 컬럼추가를 할때 시작 vs 종료  무엇을 추가를 할까 => 종료 : only 성능관점 
 
  - pk결정
  부모pk + 1) 종료일자
                 2) 시작일자 
                 3) 순번

논리적으로는 부모pk속성 + 시작,종료속성 모두를 상속해야 함 (선분을 표현하기 위해서 두점이 필요하므로)
 * 중복 row 는 존재하지 않는다. => 부모에 존재한 row 는 자식에 나오지 말아야함
   

반응형

'생계 > DA' 카테고리의 다른 글

모델링에 대한 생각  (0) 2023.12.27
RDBMS 에서의 관계 라는 것  (0) 2023.12.12
엔터티 통합과 분리  (0) 2023.12.09
엔터티 유형 분류  (0) 2023.11.29
논리 데이터 모델링 절차  (0) 2021.10.16
Posted by 돌고래트레이너