본문 바로가기

Library/Database

Assertion 테이블 제약조건을 사용하여 하나의 테이블에 대해서 복잡한 제약조건을 명시할 수 있다. 해당 조건식을 check 절을 사용하여 명시할 수 있다. 일반적인 Create 명령은 튜플이 하나도 없다면 제약조건이 검사되지 않는다. 따라서, 튜플이 없을 때에도 제약조건을 검사하기 위해서 다른 방법이 필요한데, 이것인 assertion이다. 이 방법을 사용하면 테이블에 실제로 튜플이 하나도 존재하지 않는 경우라고 하더라도 해당 테이블의 제약조건을 검사할 수 있다. 더보기
NULL in SQL NULL은 아직 정의되지 않은 값에 대해서 표현될 수 있는 값이다. 하지만, 이 때문에 산술연산과 기타 연산에서 미묘한 문제를 일으킨다. NULL과 NULL의 대소비교 결과는 무엇인가? NULL과 산술연산 결과는 어떻게 정의되어야 하는가? 간략한 논리부터 이야기하면, AND, OR, NOT 연산에서 unknown이 가장 우선순위가 높다고 할 수 있다. 즉, AND의 피연산자 중에 NULL이 의미하는 unknown이 존재하면 나머지 다른 하나의 피연산자에 상관없이 결과는 unknown이 된다. 여기서 특이한 것은 중복 문제와 NULL의 처리인데, 이것은 놀랍게도 두 NULL이 있다면 (NULL = NULL) 이것은 true이고, 중복된 행이라고 판단한다. 이것은 예외 사항이다. 두 NULL인 unknown.. 더보기
GROUP BY and HAVING group by 절은 어떤 역할을 하는가? from, where 절과 무엇이 다른가? 먼저, SQL 질의는 하나의 select 절과 결과 테이블의 cross-product를 표시하는 from 절을 가져야 하며, 선택적인 where 절은 from 절에서 언급된 테이블에 대한 선택조건을 표시한다. group by 절은, 릴레이션의 행들에 대해서, 각 그룹별로 집단 연산을 적용하고 싶은 경우에 사용한다. having 절은 이때 선택되는 group에 대해서 제한조건을 명시하게 된다. 집단 함수(Aggregate Operator)는, 여러 원소에 대해서 하나의 값만 결과로 돌려주는 함수를 의미한다. 예를 들어 max, min, sum 따위의 함수가 있다. group by 절에서, group이란 정확하게 무엇을 의.. 더보기
Basic SQL select 절은, 테이블에서 결과를 추출하기 위해서 사용된다(projection). 'select *' 형식으로 사용할 수도 있지만, 이것은 SQL 질의로 얻어진 결과를 명확하게 하지 않는다는 점에서 좋지않은 형식이다. from 절은, 테이블 이름들의 리스트이며, 테이블 이름은 범위변수(Range Variable)에 의해서 표시될 수 있다. where 절의 qualification은 수식의 참 / 거짓 조건을 검사하여 일치하는 조건에 대해서만 결과물을 한정하게 된다. SQL은 중첩된 형태로도 질의를 할 수 있다. 이런 형태는 from 절에서도 나타날 수 있지만, 일반적으로 where 절에 나타난다. 이런 중첩은 in 명령어를 사용하여 표현 가능하다. 어떻게 이런 중첩된 형태의 질의가 처리되는가? 이것은.. 더보기
Introduction to SQL SQL(Structured Query Language)는, 다른 DB 모델과 비교해서, RDBMS 모델이 가지는 최대 장점이라 할 수 있다. DDL(Data Definition Language)은 Create, Drop과 같은 범주의 명령을 말하며, SQL의 이 부분은 테이블의 생성, 수정, 삭제를 지원한다. 무결성 제약조건은 테이블이 생성될 때, 혹은 나중에 테이블에 대해 정의될 수 있다. DML(Data Manipulation Language)은 사용자의 테이블에 대한 질의, 행의 삽입, 삭제, 수정하는 행위 따위를 의미한다. Basic SQL 형태는 다음과 같은 형태이다. SELECT [distinct] select-list, from from-list, where qualification 모든 질.. 더보기
TRC and DRC 대수 방식이 절차적인 것에 비해, 해석은 원하는 답이 어떻게 계산되어야 하는지에 대해서 명시하고 그들의 집합을 기술한다. 관계해석은 SQL에 많은 영향을 끼쳤다. TRC(Tuple Relation Calculus)이다. TRC에 있는 변수들은 Tuple을 값으로 가진다. Tuple 변수들은, 어느 특정 관계의 Tuple을 값으로 가지는 변수를 말한다. 주어진 Tuple 변수에 대입되는 값들은 동일한 개수와 타입의 필드들을 가진다. 반대로, 도메인 변수들은, 어떤 attribute의 도메인에 있는 실제 값을 가지는 변수이다. DRC(Domain Relation Calculus) 질의의 형태는 { (x1, x2, x3...) | p(x1, x2, x3...) }의 형태이며, 이때 각 xn은 도메인 변수이거나.. 더보기
관계 대수(Relation Algebra) 데이터 무결성 제약 조건은 반드시 현실 세계를 반영해야 한다. 데이터 무결성을 위배하는 인스턴스는 존재할 수 없으며, 반대로 인스턴스만으로 데이터 무결성을 판단할 수 없다. 즉, 데이터 무결성은 귀납적인 방법으로 결정할 수 없다는 이야기다. 예를 들어, 상속 관계는 어떤 방식으로 데이터베이스에 저장되어야 하는가? 상속 관계는 슈퍼 클래스만 아니라, 서브 클래스까지 관계 집합의 속성(attribute)으로 간주하여 표현할 수 있다. 하지만, 이것은 항상 좋은 방법은 아니다. 현실에서는 하나의 개체가 여러 속성을 가질 수 있으며, 데이터베이스에서 이 관계를 그대로 표현한다면 하나의 튜플이 동일한 속성값을 중복적으로 저장할 수 있기 때문이다. 관계 대수에서 정의되는 연산자는 5개이다. Selection(δ),.. 더보기
From ER Model To Database, and View 관계집합에서 전체 참여란 무엇을 의미하는 것인가? 전체적인 참여라는 것은, 어떤 관계 집합이 있을 때, 특정 개체 집합이 이 관계 집합에 전체적으로 참여한다면, 이 특정 개체 집합의 원소 모두가 관계 집합의 부분 집합에 연관되어 있어야 한다는 것을 의미한다. 따라서, 부분적으로 참여한다는 것은, 이 개체 집합의 원소들이 반드시 관계 집합의 원소와 대응될 필요가 없다는 뜻이다. 외래 키(foregin key)는 참조하는데 목적이 있다. 즉, 관계 집합에서 특정 값이 외래 키로 선언되었다면, 반드시 그 값은 의미있는 값이어야 한다. 따라서, 참조 대상으로 선언된 키 값을 삭제하거나, 갱신하거나 하는 것은 반드시 데이터 무결성 조건을 위배하지 않아야 한다. 데이터 무결성 제약 조건은 현실 세계를 추상화하는 과.. 더보기
키(Key) 과거의 트리(tree) 기반 데이터베이스는 다루기 불편했다. 트리 기반 데이터베이스는 RDBMS의 외부 스키마와 같은 개념을 제공하지 않기 때문에, 데이터베이스에 접근하는 애플리케이션은 데이터베이스 내부의 데이터에 접근하는 방법을 모두 알고 있어야 하며, 데이터의 계층 구조까지 파악해야 하는 어려움이 있었다. 즉, 데이터 독립성을 제한하는 대신 데이터의 접근을 직접 통제할 수 있으므로 경우에 따라 최적의 효율을 내는 애플리케이션을 작성할 수 있다. 즉, DBMS에서의 데이터 독립성은 데이터 추상화 복잡도 증가와 트레이드 오프 관계에 있으며, 데이터 접근 / 탐색을 얼마만큼 효율적으로 구현하는가의 책임은 DBMS에게 넘어가게 된다. 관계형 데이터베이스는 기본적으로 테이블(table) 구조로 데이터를 표현 .. 더보기
ER Model 현실 세계를 개략적인 형태로 표현하는 것을 개념 설계(conceptual design) 단계라고 한다. 이 단계에서 얻어진 결과물들은 바로 데이터베이스에 적용할 수 없다. 개념 설계를 데이터베이스에 정형화된 형태의 데이터로 표현하기 위해서는 데이터 모델링 과정을 거쳐야 하다. 데이터 모델링은 실세계를 추상화하는 작업이다. ER Model은 데이터베이스에서 사용되는 대표적인 데이터 모델링 방법으로, 데이터와 데이터의 연관 관계를 그림으로 표현할 수 있기 때문에 전체 구조를 쉽게 파악할 수 있다는 장점을 가지고 있다. ER Model은 크게 관계 집합(relation set)과 개체 집합(entity set)으로 구분할 수 있다. 관계 집합은 개체들 사이의 연관 관계를 나타낸다. ER Model에서, 개체 .. 더보기