본문 바로가기
프로그래밍 놀이터/Database

[SQLite3] 01. SQLite 소개

by 돼지왕 왕돼지 2018. 5. 16.
반응형

[SQLite3] 01. SQLite 소개



이 글은 "빠르게 활용하는 모바일 데이터베이스 SQLite3” 이란 글을 보며 필요한 내용만 정리한 글입니다.

자세한 내용은 책을 구매해서 보세요

add column, add constraint, alter column, alter table, Android, Attach, chmod, chown, Delete, Detach, drop column, embeded, file lock, for each statement, Foreign Key, FULL OUTER JOIN, Grant, insert, IOS, License, multi process, multi thread, NFS, page size, pragma foreign_keys, pragma recursive_triggers, Public Domain, read-only, rename table, REVOKE, RIGHT OUTER JOIN, sqlite api, sqlite 소개, trigger, Update, view table, [SQLite3] 01. SQLite 소개, 간결성, 강제 제약조건, 구현, 네트워킹, 단일 데이터베이스, 동시선, 라이선스, 라이센스, 레코드 데이터, 멀티 스레드, 멀티 프로세스, 비활성화, 설정 파일, 수정 가능한 뷰, 외래키 제약 조건, 인덱스, 임베디드, 제약 사항, 제약사항, 최적화, 트리거, 트리거 지원, 티에블 스키마, 파일 단위 락, 파일 잠금, 파일 접근 권한, 파일 크기 제한, 페이지 크기

-

SQLite3 는 안드로이드, 아이폰에서 채택되면서 모바일 환경에서 가장 널리 사용되는 DB 가 되었다. ( 파폭 브라우저, 드롭박스 등에서도 사용 )

개발 초창기부터 임베디드 환경을 고려했기 때문에 SQLite3 는 다른 DB 의 대부분의 기능을 지원하면서도 상대적으로 라이브러리 크기가 작고, 메모리가 적은 환경에서도 뛰어난 성능을 발휘한다.

오픈 소스 프로젝트이며, 특별한 라이선스 없이 무료로 사용 가능하다.




1. 주요 특징


단일 데이터베이스 파일


데이터베이스의 모든 정보가 단 하나의 파일에 저장된다.

테이블 스키마, 레코드 데이터, 인덱스와 같은 모든 정보가 한 파일에 저장되며, SQLite API 로 DB 를 열 때도 해당 파일의 이름을 인자로 받는다.


다른 DB 파일에 있는 데이터를 이용하는 것도 가능한데 이 때는 ATTACH / DETACH 문을 이용해 다른 DB 파일에 들어있는 데이터를 연동하면 된다.


단일 파일 동작이기 때문에 멀티 프로세스나 멀티 스레드로 동작하는 경우 파일 잠금(File lock) 이슈가 발생할 수 있으므로 주의해야 한다.



설정 파일


별도의 설정 파일이 없고 별도 서버를 구동하는 등의 사전 작업이 없다.



간결성


간결함은 매우 큰 장점이나 페이지 크기(page size) 제한이 있고, 파일시스템에 파일로 저장되기 때문에 파일 크기 제한이 있는 경우 DB 가 동작하는 데 문제가 생길 수 있다.



라이선스


Public domain 이다. 저작자가 자신의 의사로 저작권을 포기한 경우를 말한다.

마음대로 써도 된다.



동시성


읽기는 여러 프로세스에서 가능하지만, 쓰기는 한 순간에 오직 하나의 프로세스만 가능하다.



네트워킹


별도의 DB 서버로 구동되지 않고 프로그램에 포함된 라이브러리 형태로 동작.

네트워킹 기능을 특별히 지원하지 않지만 필요한 경우 NFS(Network File System)을 이용할 수는 있다. 그러나 latency 문제나 파일 잠금과 관련한 이슈가 생길 가능성이 있으므로 주의해야 한다.



동적 자료형


자료형은 그것을 저장하는 저장소가 아닌 값 자체에 의해 결정된다.

그래서 테이블을 생성할 때 선언한 칼럼의 자료형과 일치하지 않는 데이터도 저장할 수 있다.




2. 주요 사용처




3. SQLite3 의 제약사항


-

SQL 표준에 정의된 바를 SQLite3 에서도 수행할 수 있다.

하지만 일부 기능은 구현의 용이함과 최적화를 위해 현재 구현 중이거나 구현에서 누락된 경우가 있다.

또한 이미 기능은 구현돼 있지만 하위 호환성을 유지하기 위해 비활성화된 기능도 있다.



트리거 지원


FOR EACH STATEMENT 트리거를 제외하고 모든 트리거 기능을 사용할 수 있다.

SQLite 3.6.18 버전에서는 recursive triggers 기능이 추가되었지만 하위 호환성 이슈로 기본 비재귀적으로 설정되어 있다. 

PRAGMA recursive_triggers 구문을 이용하면 활성화 시킬 수 있다.



ALTER TABLE 지원


RENAME TABLE 과 ADD COLUMN 은 지원하지만, DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT 와 같은 구문은 지원하지 않는다.

하지만 동적 자료형과 RENAME TABLE 을 적절히 활용하면 지원하지 않는 모든 기능을 동일하게 구현할 수 있다.



RIGHT, FULL OUTER JOIN


LEFT OUTER JOIN 은 지원하지만 RIGHT OUTER JOIN 과 FULL OUTER JOIN 은 지원하지 않는다.

하지만 LEFT OUTER JOIN 구문을 논리적으로 변경해서 RIGHT OUTER JOIN 을 수행할 수 있다.

또한 FULL OUTER JOIN 은 연산과정 자체가 복잡해서 시간이 오래 걸리고 CPU 에 많은 부담을 주므로 다른 임베디드 DBMS 에서도 대부분 지원하지 않는다.



수정 가능한 뷰


뷰는 기본적으로 읽기 전용(read-only)이다.

트리거를 이용하면 뷰에 DELETE, INSERT, UPDATE 연산이 수행되는 것과 동일한 효과를 낼 수 있다.



GRANT, REVOKE 구문


서버/클라이언트 구조의 DBMS 에서 필요한 녀석인데, 유사한 효과를 얻고 싶다면 데이터베이스 파일에 대한 접근 권한을 설정하는 것으로 흉내낼 수 있다. 리눅스의 chmod, chown 명령어 등을 사용하면 된다.



외래키 제약 조건


FOREIGN KEY 는 하위 호환성을 위해 비활성화되어 있다.

FOREIGN KEY 를 사용해도 문법적 오류는 나지 않지만 강제적인 제약조건으로 동작하지는 않는다.

3.6.19 이후 버전에서는 PRAGMA foreign_keys 구문으로 제약조건을 활성화할 수 있고, 이전 버전에서는 트리거를 이용해 다른 DBMS 와 동일하게 제약조건으로 동작하게 할 수 있다.




반응형

댓글