2020-2-5 DB공부 - Join, Key, Anomaly

DB공부

Key

  • key란 검색, 정렬시 Tuple을 구분할 수 있는 Attribute

candidate key(후보키)

  • tuple을 유일하게 식별하기 위해 사용되는 속성들의 부분집합.(기본키로 사용할 수 있는 속성들)
  • 유일성 : key로 하나의 tuple을 유일하게 식별
  • 최소성 : 꼭 필요한 속성으로만 구성.

Primary key(기본키)

  • 후보키 중 선택한 Main key
  • Null을 가질 수 없고 동일한 값이 중복될 수 없다!!

Alternative Key(대체키)

  • 후보키중 기본키를 제외한 나머지

Super Key

  • 유일성은 만족하지만 최소성은 만족하지 못하는 키

Join

  • Join이란 두개 이상의 테이블이나 DB를 연결하여 데이터를 검색하는 방법. 테이블을 연결하려면 적어도 하나의 컬럼은 서로 공유하고 있어야한다.

####Inner Join

  • 기준테이블과 join테이블의 교집합을 보여준다.
select a.name, b.age from ex_table_a inner join join_table b on a.no_emp = b.no_emp

left outer join

  • 기준테이블값과 조인테이블과 중복된 값을보여준다. 왼쪽 테이블 기준으로 join을 한다.
select a.name, b.age from ex_table_a left outer join join_table_b on a.no_emp = b.no_emp

right outer join

  • left outer join의 반대로 오른쪽 기준으로 join
select a.name, b.age from ex_table_a right outer join join_table_b on a.no_emp = b.no_emp

full outer join

  • a와 b의 합집합
select a.name, b.age from tableA full outer join tableB on a.no_emp = b.no_emp

cross join

  • 모든 경우의 수를 표현해주는 방식, A가 3개 B가 4개면 총 3*4=12개를 검색한다.
select a.name, b.age from tableA cross join join_b

self join

  • 자기자신과 자기자신을 조인, 자신이 갖고 있는 컬럼을 다양하게 변형시켜 활용할 때 자주 사용
select a.name, b.age from tableA, tableB

SQL과 NoSQL의 차이

SQL

  • SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색할 수 있다.
  • 관계형 데이터베이스는 정해진 데이터 스키마에 따라 저장, 관계를 통해 여러 테이블에 분산 된다.
  • 스키마를 준수하지 않은 레코드는 저장할 수 없다 !

NoSQL

  • 스키마도 없고 관계도 없다. NoSQL에서는 레코드를 문서(document)라고 부른다. NoSQL은 다른 구조의 데이터를 같은 컬렉션에 저장 가능.
  • 문서(document)는 JSON과 비슷한 형태. 여러 테이블에 나누지 않고 동일한 컬렉션에 넣는다.
  • JOIN을 하고 싶으면 컬렉션을 통해 데이터를 복제하여 일부분에 속하는 ㅂ데이터를 정확하게 산출한다.

저장방식으로 인해 SQL 데이터는 수직적 확장만 지원, 수평적 확장인 NoSQL에서만 가능

장단점

SQL 장점 및 단점
  • 명확하게 정의된 스키마, 데이터 무결성 보장
  • 관계는 중복없이 한번만 저장
  • 덜유연하고 데이터 스키마를 사전에 알려야하고 나중에 수정하기 힘들다.
  • 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어지기 쉽다.
  • 대체적으로 수직적 확장만 가능
NoSQL 장단점
  • 유연하고 데이터는 애플리케이션이 필요한 형식만 저장된다. 읽어오는 속도는 빨라진다.
  • 수직 및 수평적 확장이 용이하므로 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 가능
  • 유연성으로 인해 데이터 구조결정을 미룰 수 있다.
  • 중복을 계속 업데이트 해야한다.
  • 데이터가 여러컬렉션에 중복되있어서 수정시 모든 컬렉션에서 수행해야한다.
SQL 사용이 더 좋을때
  • 관계를 맺고 있는 데이터가 자주변경될때, NoSQL에서는 여러컬렉션을 모두 수정해야되서 비효율적.
  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
NoSQL 사용이 더 좋을때
  • 변경이나 확장이 많을때
  • 읽기를 자주하지만 데이터 변경은 자주 없는 경우
  • 데이터베이스를 수평적으로 확장해야 하는 경우(막대한 양의 데이터를 다뤄야 하는 경우)

DB이상현상(Anomaly)

잘못된 테이블 설계로 인해 Anomaly(이상현상)이 나타난다. 때문에 정규화를 해야한다.

예) {StudentID, CourseID, Department, CourseID, Grade}

삽입이상(insertion Anomaly)

  • 기본키가 {Studnet ID, Course ID}인 경우 -> course를 수강하지 않은 학생은 course id가 없는 현상이 발생. course id는 기본키이기때문에 null이 안되므로 table에 추가가 안된다. 삽입을 위해 ‘미수강’같은 course id를 만들어야함.

    불필요한 데이터를 추가해야지 삽입할 수 있는 상황

갱신이상(Update Anomaly)

  • 어떤 학생의 전공(department)가 컴퓨터에서 음악으로 바뀐경우. 모든 department를 ‘음악’으로 바꿔야한다. 그러나 일부를 깜빡하고 바꾸지 못하는 경우.

    일부만 변경하여, 데이터가 불일치 하는 모순문제 발생 = update anomaly

삭제이상(Deletion Anomaly)

  • 수강을 철회하는 경우, {student id, course id, department, cour id, grade}의 정보중 student id, department와 같은 학생에 대한 정보도 같이 삭제됨

    튜플 삭제로 인해 꼭 필요한 데이터까지 삭제되는 문제

reference
  • https://nesoy.github.io/articles/2018-05/Database-Shard
  • [https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/%5BDB%5D%20Key.md
Written on February 5, 2020