{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%load_ext sql\n", "%sql sqlite:///" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "숙제 2\n", "=======\n", "\n", "\n", "### 일러두기 :\n", "\n", "**_꼼꼼하게 읽어보기 바랍니다_**\n", "\n", "* 이 숙제를 풀기 위한 별도의 데이터는 제공되지 않음. 대신, 각자가 테이블과 값을 생성하여 해답을 작성하거나 그 해답을 검증해야 함. \n", "* 테스트, 디버그, 탐색하기 등을 위해서 새로운 셀을 생성하는 것을 적극 권장함. **단, 작성한 해답은 해답인 것을 알아 볼 수 있도록 명료하게 표현하고 해답을 위한 셀에 작성할 것**\n", "* 셀을 실행시키고 셀 왼 편에 `In [*]:` 이 보인다면 _실행 중_ 을 의미함\n", " * **만약 셀이 오랫 동안 결과를 내 놓지 않고 멈춘 것 같다면: SQL 에 다시 연결하도록 python kernel을 다시 시작해야 함**\n", " * 커널을 다시 시작하는 방법: \"Kernel >> Restart & Clear Output\", 그리고 위의 셀부터 아래로 하나씩 실행 함 \n", " * 다른 버전의 데이터베이스를 로드하기 위해서도 마찬가지를 새로운 연결을 만들어야 함\n", "* 기억하기:\n", " * `%sql [SQL 질의문;]` 은 _한 줄짜리_ SQL 질의문에 사용\n", " * `%%sql \n", " [SQL 질의문;]` 은 _여러 줄짜리_ SQL 질의문에 사용\n", "* 제출 방법은 `submmision_instruction.txt`을 참고할 것" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "문제 1\n", "---------\n", "\n", "이 문제에 포함된 하위 문제들에 대해 단 하나의 SQL질의문을 작성하기 바랍니다. 제시한 조건들이 만족하는 경우가 있는지 검사해보기 원한다면, 질의문을 실행했을 때 결과가 나오면 안되며, 결과가 안나올 때에만 조건이 만족하는 것입니다. 조건이 만족하지 않는다면, 어떤 결과를 출력하겠지만, 그 출력 결과의 내용이 중요한 것은 아닙니다. \n", "\n", "주의해야 할 것이 있습니다. 문제가 제시한 조건들은 외적으로 정의된 FD 없이는 **일반적으로** 존재한다고 증명할 수 없습니다. 문제에서 요구하는 것은 어떤 특정 터플들의 집합이 있다고 했을 때 일반적으로 그런 조건들이 만족하는 테이블을 생성할 수 있는지 확인을 해보라는 말이다. \n", "\n", "테이블에는 `NULL` 값이 없다고 가정을 하자. 그리고 릴레이션은 집합이지 multiset이 아니라고 가정하자. 하지만, 그런 가정이 없다고 하면 일반적인 인스턴스에서도는 작성한 질의문이 동작할 것입니다. 아래에 정의한 스키마의 테이블들은 편의를 위해서 제공하는 것이지만 작성한 질의문의 검증을 위해서는 새로운 테이블을 만들어서 확인해야 할 것입니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%sql\n", "DROP TABLE IF EXISTS R; CREATE TABLE R (W INT, X INT, Y INT, Z INT);\n", "DROP TABLE IF EXISTS Cat; CREATE TABLE Cat(cat_name TEXT, breed TEXT, owner_name TEXT);\n", "DROP TABLE IF EXISTS Owner; CREATE TABLE Owner(owner_name TEXT, ssn INT, hometown TEXT);\n", "DROP TABLE IF EXISTS S; CREATE TABLE S (A INT, B INT, C INT, D INT, E INT);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 1a\n", "\n", "$\\{X, Y\\}$ 는 $R(W,X,Y,Z)$의 **수퍼키**이다. 필요한 경우 릴레이션에 값을 넣어서 검증 해보기 바랍니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%sql" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 1b\n", "\n", "$R(W,X,Y,Z)$의 각 속성이 키이다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%sql" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 1c\n", "\n", "**multivalued dependency (MVD)** 은 다음과 같이 정의됩니다. 어떤 속성들로 이루어진 스키마 $R$이 두 속성 집합과 $A\\subseteq R$ 과 $B\\subseteq R$의 관계를 갖고 있는 경우를 생각해봅시다. 이 관계를 MVD를 $A\\twoheadrightarrow B$로 표현할 수 있으려면 다음의 조건이 만족해야 합니다. $t_1[A] = t_2[A]$인 어떤 두 터플 $t_1, t_2$가 존재하고, 세 번째 터플 $t_3$가 다음의 조건을 만족하는 경우 **$R$은** MVD를 만족합니다.\n", "\n", "* $t_3[A] = t_1[A] = t_2[A]$\n", "* $t_3[B] = t_1[B]$\n", "* $t_3[R\\setminus B] = t_2[R\\setminus B]$\n", "\n", "이 때, $R\\setminus B$은 $R$의 모든 속성들이 $B$에 존재하지 않으며 $t_3$는 $t_1$ 또는 $t_2$에 대해 유일한 값일 필요가 없습니다. MVD 조건은 _릴레이션_ 전체에 대해서 유지되어야 합니다. MVD의 조건은 어떤 두 터플의 순서와 상관없이 위의 조건을 만족해야 합니다. MVD에 대해서 더 자세히 알고자 한다면 강의자료를 참고하기 바랍니다.\n", "\n", "이 문제에서는 $S(A, B, C, D, E)$에서 MVD $\\{B\\}\\twoheadrightarrow \\{D,E\\}$ 이 만족 여부를 검사하는 질의문을 작성하기 바랍니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%sql" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "문제 2\n", "---------\n", "\n", "\n", "### 문제 2a\n", "\n", "릴레이션 $T(V,W,X,Y,Z)$이 있다고 합시다. _두 개의 서로 다른 FD 집합_ `F_1` 과 `F_2`을 작성하되 각각의 FD가 $T$에서 **가장 많은 수의 키가** 포함하도록 만들어 보십시오. \n", "\n", "FD 목록을 Python list로 작성하되 각 요소가 집합으로 표현되도록 만들기 바랍니다. 예를 들어 집합 `F_1`는 $\\{V,W\\}\\rightarrow\\{X,Y\\}$ 와 $\\{W\\}\\rightarrow\\{X\\}$ 두 개의 FD로 이루어졌다고 하면 Python list로 다음과 같이 표현할 수 있습니다. \n", "\n", "```python\n", "F_1 = [(set(['V','W']), set(['X','Y'])), (set(['W']), set(['X']))]\n", "```\n", "* Note: 위의 예가 해답의 일부라고 생각하면 안되고, FD를 표현하는 문법의 예로서만 이해해야 합니다. \n", "\n", "* Hint: 도움이 된다고 생각하면 수업자료에서 썼던 함수들을 활용해도 좋습니다. 하지만, 해답에 그 함수들이 포합되어서는 안되며, 그 함수들이 이 문제를 푸는데 꼭 필요한 것도 아닙니다. 해답에는 FD로 이루어진 list만 작성하기 바랍니다. \n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "F_1 = []\n", "\n", "F_2 = []" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 2b\n", "\n", "$i=1,...,n-2$일 때 FD로 $\\{A_i,A_{i+1}\\}\\rightarrow\\{A_{i+2}\\}$를 갖는 스키마 $T(A_1,...,A_n)$가 있다고 합시다. 이 때, $n=4$일 때 명시한 FD들이 유지가 되도록 인스턴스 $T$를 만들어 봅시다. 단, 그 외의 모든 경우는 FD로 만족하지 않도록 만들어야 합니다. \n", "\n", "이 문제를 위해 `INSERT` 문을 사용하여 아래의 테이블 `T`에 값을 누적해서 풀기 바랍니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%sql\n", "DROP TABLE IF EXISTS T; \n", "CREATE TABLE T (A int, B int, C int, D int);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "문제 3\n", "---------\n", "\n", "릴레이션 $R(X,Y,Z)$이 있다고 합시다. 각 하위 문제마다 어떤 조건이 주어질 것이고 각 문제마다 $R$에 대해 아래의 세 개의 인스턴스를 SQL에서 테이블로 생성해야 합니다. \n", "\n", "1. 인스턴스 $A$ \n", "2. $A$와 다른 인스턴스 $B$ 를 만들되 $A$에 비해 테이블에 포함 된 줄 수가 $A$도 **_한 줄 더 적어야 하며_**, $B$에 있는 줄은 $A$에도 있어야 합니다. \n", "3. $A$와 다른 인스턴스 $C$ 를 만들되 $A$에 비해 테이블에 포함 된 줄 수가 $A$도 한 줄 **_더 많아야_** 하며, $A$에 있는 줄은 $C$에도 있어야 합니다. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 3a\n", "\n", "$A$, $B$ 그리고 $C$를 만들되, $A$의 각 속성이 $A$의 키이지만, 각 속성들이 $B$ 또는 $C$의 키는 아니어야 합니다. 그런 테이블 $B$ 와/또는 $C$ 를 만들 수 없다고 생각하면 빈 테이블로 만들기 바랍니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%sql\n", "DROP TABLE IF EXISTS A;\n", "DROP TABLE IF EXISTS B;\n", "DROP TABLE IF EXISTS C;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 3b\n", "\n", "$A$, $B$ 그리고 $C$를 만들되 FD $\\{Z\\} \\rightarrow \\{Y\\}$ 그리고 $\\{X,Z\\} \\rightarrow \\{Y\\}$가 $B$에서만 만족하며, FD $\\{X,Z\\} \\rightarrow \\{Y\\}$는 $A$에서 만족하고 어떤 FD도 $C$에서는 만족하지 않도록 만들어야 합니다. 만약 그러한 $B$ 와/또는 $C$를 만들 수 없다고 생각한면 빈 테이블로 만들기 바랍니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%sql\n", "DROP TABLE IF EXISTS A;\n", "DROP TABLE IF EXISTS B;\n", "DROP TABLE IF EXISTS C;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 문제 3c\n", "\n", "$A$, $B$ 그리고 $C$를 만들되 $A$에서는 MVD $Z\\twoheadrightarrow X$ 가 유지되지만 $B$ 그리고 $C$에서는 유지되지 않도록 만들기 바랍니다. 만약 그러한 $B$ 와/또는 $C$ 를 만들 수 없다고 생각한면 빈 테이블로 만들기 바랍니다." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%sql\n", "DROP TABLE IF EXISTS A;\n", "DROP TABLE IF EXISTS B;\n", "DROP TABLE IF EXISTS C;" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" } }, "nbformat": 4, "nbformat_minor": 1 }