Database 37

JPA CascadeType

JPA CascadeTypeJPA에서 연관관계(@OneToMany, @ManyToOne) 에 부모 엔티티와 자식 엔티티에 대한 영속성 처리에 대한 설정을 할수가 있다.CascadeType.RESIST 엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다. 만약 연관 엔티티가 DB에 저장이 되어있으면 다시하며 persist 를 하는 것이기때문에 detached entity passed to persist Exception이 발생한다.이경우에는 CascadeType.MERGE를 사용한다.CascadeType.MERGE트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 ..

Database/JPA 2018.09.08

Group By 최대값을 가진 Row를 추출하는 쿼리

Group By 최대값을 가진 Row를 추출하는 쿼리Group by를 이용하여 특정필드의 최대값을 가지고 올수 있지만 group by 특성상 해당하는 row의 다른 필드의 값을 가지고 올수가 없다.최대값이 있는 row 값을 가지고 오는 방법을 아래와 같이 2가지 방법이 있다.DB, Index, Table 구조 등에 따라 속도가 달라지기때문에 그때 그때에 맞게 2가지 방법중에 사용하면 된다. SELECT a.id, a.rev, a.contentsFROM YourTable aINNER JOIN ( SELECT id, MAX(rev) rev FROM YourTable GROUP BY id) b ON a.id = b.id AND a.rev = b.rev Group BY와 SubQuery를 활용하여 먼저 id와 ..

Database/MySQL 2018.09.03

역색인 (Inverted Index)

역색인 (Inverted Index)낱말이나 숫자와 같은 내용물로부터 매핑정보를 데이터베이스 파일의 특정 지점이나 문서또는 문서 집합 안에 저장하는 색인 데이터의 구조문서 검색 시스템에서 쓰이는 가장 대중적인 데이터 구조. 대규모의 데이터에서 사용이 되다.두 가지 주된 종류가 있다 레코드 단위의 inverted index, Word 단위의 Inverted Index검색 시스템에서 본문을 LIKE로 Full Scan 하는 방식도 있지만 매우 비효율적인 방식 Lucene에서의 inverted index단어 (Term)으로 인덱싱하는 Inverted Index 방식content를 LIKE 방식으로 검색하기에는 효율적이기 않기 때문에 Term으로 나누고 Term에 해당하는 Document Id를 인덱스를 만든다..

Database 2018.08.27

Lucene Segment

Lucene Segment루씬 세그먼트 Inverted Index, Doc Value, 원본 문서 등을 저장하고 있는 단위 파일Inverted Index?RDBMS를 데이터를 테이블형태로 저장한다id: 1, value : name검색엔진에서는 inverted index라는 구조로 저장token: name, doc id : 1, 2Invertered Index를 하나의 거대한 파일이 아니라 여러개의 작은 파일 단위로 저장입벽 버퍼가 가득차거나, 1초마다 하나씩 생성한번 생성된 세그먼트는 변경이 되지 않는다.문서 변경/삭제 과정update는 존재하지 않음, delete & insert삭제는 삭제되었다는 표시만 하고 검색에서 제외세그먼트 병합 과정에서 삭제된 문서를 빼고 나머지 문서들을 모아 새로운 새그먼트를..

테이블 설계 - 정규화

데이터베이스 설계 - 정규화 제 1정규화하나의 row에서 하나의 값(원자값 atomic value)만 저장해야 된다.반복되는 데이터를 가로(열 방향)가 아닌 세로(행 방향)로 늘리는 것이 제 1정규화의 제1단계이다정규화 이전상품 번호, 색상1번 상품, 검은색, 빨간색2번 사품, 검은색, 노랑색정규화 이후1:N 구조의 테이블의 생성이 된다상품 테이블1번2번상품 컬러 테이블1번, 검은색1번, 빨강색2번, 검은색2번, 노랑색 제 2정규화제2정규화에서는 데이터 중복하는 부분을 찾아내서 테이블로 분리 한다.세로 행방향의 반복되서 중복되는 데이터를 테이블로 분리를 한다.각각의 속성은 PK에 종속이 되어야 있어야 된다.ex)product_namesPK : productId.. or productNameId이 테이블에..

Database 2018.08.12

Mysql Query Plan

Mysql Query Plan`EXPLAIN` 키워드를 사용을 하면 해당하는 Query의 실행 계획을 볼수 있다. 여러가지 정보를 볼 수있는 그중에 필요한 컬럼의 의미에 대해서 정리를 한다. idSelect의 identifierNull 인경우에는 union의 결과값은 id M, N의 결과의 union 결과값select_typeSIMPLEPRIMARYUNIONUNION RESULTSUBQUERYtable사용되는 테이블 이름 - union 된 select 값 N 번 select 값typejoin typepossible_keys사용이 가능한 인덱스 key의 예비후보 null 인경우에는 index와 상관이 없다.key사용되는 인덱스이름rows결과값을 얻기위해 검색을 해야되는 row의 갯수Reference- ht..

Database/MySQL 2018.07.24

Mysql Index HInts

Mysql Index HintsMysql를 사용을 하다보면 원하는 인덱스가 아니고 다른 인덱스를 사용하여 쿼리 성능이 느린 경우가 있다. 이때 Mysql에서 제공하는 Index Hints를 쓰면 강제적으로 할당한 Index를 이용하여 쿼리가 실행이 된다. 하지만 JPA(hibernate)에서 사용이 불가능하기 때문에 JdbcTemplate 등을 이용하여 Native Query로 활용해야 된다.사용방법tbl_name [[AS] alias] [index_hint_list] index_hint_list: index_hint [index_hint] ... index_hint: USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) | IGNORE {INDE..

Database/MySQL 2018.07.24

Grafana - 시계열 데이터 Dashbaord

Grafana- 시계열 데이터를 저장을 하고 그래프를 표현을 할때 직접 UI 개발을 통해 구현을 할수 있지만, 오픈 소스인 Grafana를 통해 쉽게 그래프 대시보드를 만들수가 있다. 지원하는 Database- Graphite- Influxdb- ElasticSearch- etc.. Docker를 이용하여 Quick Start$ docker run \ -d \ -p 3000:3000 \ --name=grafana \ -e "GF_SERVER_ROOT_URL=http://grafana.server.name" \ -e "GF_SECURITY_ADMIN_PASSWORD=secret" \ grafana/grafana backend for grafana- Mysql- SQLiteDashboardRerference..

Graphite

Graphite- 시계열 데이터베이스중에 하나로써 Metric 정보를 저장하는 곳이 특화가 되어있는 데이터베이스이다.- Graph Dashboard Grafana와 연동이 쉽다. 구성요소- carbon : a Twisted daemon that listens for time-series data - carbon-cache - carbon-aggregator - carbon-aggregator-cache - carbon-relay- whisper : a simple database library for storing time-series data- graphite webapp : A Django webapp that renders graphs on-demand using Cairo Installdocker..