(CodeStates)Daily memoir

회고록(25) - 스키마

테디규 2022. 12. 2. 23:16

1. 데일리 일기

불금 저녁시간 이유 없이 놀고싶은 순간이다. 10분 앉아서 공부했는데 할만하면 아직 멘탈이 남아있다는거다. 그러므로 회고록을 쓰도록하자.

오늘 학습상담을 받았다.

학습상담 신청 사유

네트워크 부분을 공부하면서, 내가 만족할정도로 이해를 하지않고 넘어가서 막연히 이후 개발에 안좋은 영향을 미칠까 걱정되서 상담을 신청하게 되었다. 요약하자면 공부했는데 내거 같지 않아서 이대로 가도 되나 싶어서 신청했다.

답변

이상적으로는 배워서 이해하고 완벽하게 정리하는 것이 좋지만, 이렇게 배워서 이해하려는 단계일때 완벽하게 정리하려고 하다보면 오히려 지쳐서 독이 될 수 있다는 이야기를 들었다.

  • 어느 순간부터 왜 이 개념 또 몰라서 찾아보고, 검색해보고 있지 하면서 스스로를 괴롭히는 과정이 진행되고 있었던 것 같다. 완벽할 수 없다는 것을 알고있음에도 이것저것 해야할 일들 하다보면 자기자신을 못볼때가 참 많은 것 같다. 그래서 메타인지가 중요한 거 같다. 언제 한번 블로그에 제대로 정리해봐야겠다.

또한 특히 이번 네트워크는 개념책읽듯이 "A는 B고 이렇게 동작하고 이렇게 활용 돼요." 식으로 하는 챕터였다보니 더 내것으로 체감되지 않을 수 있다. 이후에 진행하면서 계속 실제로 만져보고 경험할테니 걱정하지 말라고 이야기 해주셨다.

  • 역시 무언가를 만져보면서 경험을 겪어봐야 비로소 내것이 되는거 같다. 물론 앞으로 Spring으로 서버를 다루면서 어느정도 익숙해지겠지만, 그래도 불안해서 진짜 내 방식대로 한번 정리하려고한다. 다른 좋은 퀄리티의 블로그랑 비교하지말고 그냥 순전히 내가 이해할 수 있는 선으로만 정리해보자. 블로그글도 개발 처럼 계속 업데이트 하면되니까, 틀리거나 퀄이 좀 별로라고 생각되도 걱정말고 그냥 블로깅하자.

2. 오늘 배운 내용

스키마

정의

  • 쉽게말하면 데이터베이스의 청사진이다. 데이터베이스속 데이터의 구조, 표현방식, 관계들을 정의해놓은 구조이다.

DB 관련 용어들

  • 테이블(relation) : 데이터 값을 항목(행과열)으로 저장한 구조
  • 컬럼 : 테이블의 열
  • 레코드 : 테이블의 행
  • 기본키(Primary Key) : 레코드를 식별하기 위한 고유한 값
  • 외래키(Foreign Key) : 두 테이블의 연결을 설정하는 key 값으로 외래키가 존재하는 table에 저장 될수 있는 다른 테이블의 데이터를 제어하는데 사용된다.
  • 엔티티 : 자바의 객체 개념처럼 DB에서도 관계가 있는 각 테이블 객체를 엔티티라고 부른다.

테이블 간의 관계

1:1 관계

테이블들이 1대1 관계를 가지고 있는 경우로 굳이 정의하자면 대한민국 국민 테이블 : 주민등록번호 테이블 이라고 볼 수 있겠다.

굳이 1:1 관계이면 사용할 필요는 없다. 그냥 column으로 쓰는게 더 좋다.

1:N 관계

1개의 테이블 레코드가 N 개 레코드를 가질수 있는 관계이다. N인 쪽에 레코드를 증가시키는 방식으로 사용해야 데이터 정합성문제를 피할수 있다. 쉽게 말하자면 외래키를 N쪽에 놓으라는 의미이다.

예시로 들자면 고객은 여러개의 주문을 할수 있지만, 주문은 일반적으로 한 사람에게 귀속되어야한다.(물론 공동구매처럼 여러 사람들에게 귀속돌수도 있긴하지만, 일반적으로는 한사람에게 귀속되어야한다.)

N:M 관계

양쪽 다 한 레코드별로 여러 레코드들을 가질수 있는 관계이다. 그냥 다대다로 연결해버리면, 컬렉션의 형태로 저장하거나 해야하는데 DB는 속성에 한 값밖에 넣을 수 없으며, 혹여나 리스트로 넣는다고 하더라도 조회하는데 많은시간이 걸리는 문제가 발생한다.

그래서 다대다 관계의 테이블들 사이에 조인 테이블을 만든다. 조인테이블은 양 테이블들과 일대다 의 관계를 가지고 있기 때문에, 외래키값에 해당하는 필요한 데이터들을 빠르게 조회해올수 있다.

자기참조관계

같은 테이블에 있는 컬럼을 참조하는 관계이다. 예를 들자면 추천인 로직이 있다. A 유저는 여러유저에게 추천인을 받을수 있으므로 A 유저id는 추천인들의 id와 일대다 와 같은 관계를 가질수 있다.(단 이런 방식을 일대다의 관계(서로 다른 테이블들 간의 관계여야함)라고 표현하지않는다.)

혼자 공부로 새로 알게 된 내용

거듭제곱 알고리즘

  • 일반적으로 N번 시행하는 거듭제곱은 O(N)을 가지지만, 거듭제곱을 지수부분을 2로 나눈값을 구하여 재귀를 이용하면 O(logN)으로 시간복잡도를 줄일 수 있다. (ex) 3^40 = 3^20 * 3^ 20 / 3^10* 3^10 / 3^5 * 3^5/ 3^2 * 3^2 * 3 .... 1)