오늘도 더 나은 코드를 작성하였습니까?

테이블 검색 지원 본문

Android Jetpack Architecture/Room

테이블 검색 지원

hik14 2020. 8. 23. 17:44

데이터베이스 인덱스(Database Index)

 

RDBMS에서 대용량 데이터(레코드)가 있을 때, 특정 데이터를 검색하기 위해서 테이블의 레코드를 full scan 하는 것이 아니라, 인덱스가 적용된 칼럼의 테이블(칼럼, 인덱스 주소)을 따로 저장해놓고 그것을 검색해서 검색 효율을 높이는 방법이다.

 

인덱스가 설정된 필드 값을 포함한 데이터의 삽입, 삭제, 수정 작업이 원본 테이블에서 이루어질 경우, 인덱스도 함께 수정되어야 합니다. 따라서 인덱스가 설정된 테이블의 처리 속도가 느려질 수 있습니다.

그러므로 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 더 좋습니다.

 

FTS (Full-text Index)

 

문서의 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문(Full Text) 검색

 

Full-text Index의 경우에는 한 칼럼 안에서 많은 형태의 데이터가 담겨있어서 효율적으로 데이터를 찾는 경우 사용하는 것이 일반적입니다.

 

게시판의 Contents 같이 긴 텍스트에서 키워드를 이용하여 검색

 

Contents필드  내용들을 모두 검색해서 검색에 불필요한 단어 (a , the, 등을) 빼고 나머지 단어들을 Index 카탈로그 정장해뒀다가 Full text로 질의를 하면  board 테이블을 contents를 전체를 검색하지 않고 미리 만들어놓은 카탈로그를 통해서 레코드를 찾아준다. 

 

ROOM


Room은 데이터베이스 테이블에서 세부 정보를 더 쉽게 검색할 수 있게 하는 여러 유형의 주석을 지원합니다. 앱의 minSdkVersion이 16 이하인 경우를 제외하고 전체 텍스트 검색(full text search)을 사용합니다

 

앱에서 FTS(전체 텍스트 검색)를 통해 데이터베이스 정보에 매우 빠르게 액세스해야 한다면 FTS3 또는 FTS4 SQLite 확장 모듈을 사용하는 가상 테이블을 통해 entity를 지원하세요. 

 

 Room 2.1.0 이상에서 제공되는 이 기능을 사용하려면 다음 코드 스니펫과 같이 지정된 항목에 @Fts3 또는 @Fts4 주석을 추가합니다.

 // 앱이 디스크 공간에 대해 엄격하거나 이전 SQLite 버전을 호환해야 하는 경우 @Fts3를 사용한다.
    @Fts4
    @Entity(tableName = "users")
    data class User(
        /* Specifying a primary key for an FTS-table-backed entity is optional, but
           if you include one, it must use this type and column name. */
        @PrimaryKey @ColumnInfo(name = "rowid") val id: Int,
        @ColumnInfo(name = "first_name") val firstName: String?
    )

 

참고: FTS 지원 테이블은 항상 INTEGER 유형의 기본 키를 사용하며 'rowid'라는 열 이름을 사용합니다. FTS 테이블 지원 항목에서 기본 키를 정의하는 경우 이러한 유형 및 열 이름을 반드시 사용해야 합니다.

 

테이블이 여러 언어로 된 콘텐츠를 지원하는 경우 다음과 같이 languageId 옵션을 사용하여 각 행의 언어 정보를 저장하는 열을 지정합니다.

@Fts4(languageId = "lid")
    @Entity(tableName = "users")
    data class User(
        // ...
        @ColumnInfo(name = "lid") val languageId: Int
    )

Room은 결과 정렬, tokenizer 유형 및 외부 콘텐츠로 관리되는 테이블을 비롯하여 FTS 지원 항목을 정의하기 위한 몇 가지 기타 옵션을 제공합니다. 이러한 옵션에 관한 자세한 내용은 FtsOptions 참조를 확인

 

Index (색인)

 

앱에서 FTS3 또는 FTS4 테이블 지원 항목을 사용할 수 없는 SDK 버전을 지원해야 할 때에도 여전히 데이터베이스에 있는 특정 열의 색인을 생성하여 쿼리 속도를 높일 수 있습니다.

entity에 인덱스을 추가하려면 @Entity 주석 내에 indices 속성을 포함하여 인덱스 또는 복합 인덱스에 포함하려는 열의 이름을 나열합니다

 @Entity(indices = arrayOf(Index(value = ["last_name", "address"])))
    data class User(
        @PrimaryKey val id: Int,
        val firstName: String?,
        val address: String?,
        @ColumnInfo(name = "last_name") val lastName: String?,
        @Ignore val picture: Bitmap?
    )

때로 데이터베이스의 특정 필드 또는 필드 그룹은 고유해야 합니다. @Index 주석의 unique 속성을 true로 설정하여 이 고유성 속성을 적용할 수 있습니다.

firstName  lastName 열의 동일한 값 세트가 포함된 두 행이 테이블에 없도록 합니다.

 @Entity(indices = arrayOf(Index(value = ["first_name", "last_name"],
            unique = true)))
    data class User(
        @PrimaryKey val id: Int,
        @ColumnInfo(name = "first_name") val firstName: String?,
        @ColumnInfo(name = "last_name") val lastName: String?,
        @Ignore var picture: Bitmap?
    )

'Android Jetpack Architecture > Room' 카테고리의 다른 글

뷰 만들기  (0) 2020.08.24
중첩된 관계 정의  (0) 2020.08.23
객체 간 관계 정의  (0) 2020.08.23
Entity 생성하기  (0) 2020.08.23
Room 개요  (0) 2020.08.22