요즘 페어활동 하는 시간이 재밌다.
적극적이신분들을 많이 매칭되서 그런가
페어할때 서로 의견을 나누고
모르는 부분에 대해서 알아갈때 같이 알아가는 재미가 쏠쏠하다.


오늘은 관계형 데이터베이스의
설계를 배우는 날이다.

어제까지 관계형 데이터 베이가 무엇인지와
간단한 SQL 문법을 배웠다.
개발자 뿐만아니라 SQL은 금융종사자들이나
회계쪽도 많이 사용하는듯 보인다.

설계를 배우기전 먼저 어제 배웠던 내용을 로커환경에서
작업하며 복습해보자

MySQL 터미널로 작업하기

어제 공부했던 문법들을 실제로 써보는 시간이 왔다.
먼저 brew를 이용해 mysql을 사용할 수 있게 만들어줘야한다.

brew install mysql

위의 코드를 입력해 설치해주자

brew services start mysql

그리고 다음으로는 mysql를 실행해줘야 접속이 가능하다.
처음에는 비밀번호가 설정되어 있지 않기때문에

mysql -u root

위에 명령어를 입력하여 mysql 화면에 진입이 가능하다.











위와 같은 화면이 나오면 진입한 것이다.
만약 ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO)
이렇한 에러가 발생했다면, 이미 패스워드를 만들었기때문에

mysql -u root -p

-p를 추가하여 진입이 가능하다.




그 이후에는 이렇게 아래에
입력시 비밀번호 키입력하라고 표시되며
위에서 등록한 비밀번호로 접속을 시도하면 된다.

여기서 만약 비밀번호가 없어 설정을하고 싶으면

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword';

mysql 진입화면에서 위에 명령어를 입력해주면 비밀번호가 설정된다
yourPassword 안에는 당연히 본인이 원하는 비밀번호를 입력하자

데이터 베이스 확인











show를 통해 데이터 베이스를 확인이 가능하다.


데이터베이스 삭제












6개의 데이터 베이스가 있는데 임시로 만들어준
DROP DATABASE를 이용해 People을 삭제해보았다.
삭제후 show를 통해 재확인


데이터베이스 접속




데이터 베이스를 만들었으면
해당 데이터베이스에 사용해야한다.

USE 를 이용해 데이터 베이스에 접속.
여기부터 사용하는 명령의 대상은 해당 데이터 베이스가 된다.


TABLE 값 추가 및 확인











이후에 INSERT INTO 명령어를 입력해
새로운 데이터들을 삽입.
DESCRIBE 명령어를 통해서 해당 Table에 내용을 확인할 수 있다.


COLUMN 데이터 확인








SELECT FROM을 이용해
해당 COLUMN의 데이터를 상세 조회할 수 있다.
나는 INSERT를 3번했고 2개의 값은 넣지 않고 쿼리를 입력했다.


데이터 변경











이제 데이터베이스가 만들어지고 COLUMN도 만들어졌다.
안에 있는 내용을 바꾸고 싶다면
UPDATE를 이용해 값을 조정할 수 있다.

이외에 여러 테이블을 만들어 JOIN을 확인해보거나
다른 명령어를 실험해보면서 SQL 문법에 대한
이해를 해보면 좋을 것 같다.


RDBMS 설계

Schema
스키마는 데이터베이스에서 데이터가 구성되는 방식과 서로 다른
엔티티(Entity) 간의 관계에 대한 설명이다.
아래는 테이블간의 관계를 나타내는 스키마이다.
















entity : 간단하게 테이블로 정의된 단위라고 볼 수 있다. ex) Custmoer, Employee
tabel : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적된다.
column 또는 fields : 테이블의 한 열을 가르킨다. ex) CustmoerId, FirstName, LastName etc…
record : 테이블의 행을 카르킨다. 컬럼의 하나의 열에 들어가 잇는 데이터라고 보면된다.

CustomerId FirstName LastName
1 Lee JaeHyeok
2 Yeum seungho

표처럼 표시한다면 위와 같이 표시할 수 있을 것 같다.
Customer라는 테이블안에 CustomerId, FirstName, LastName이라는
열을 표현한뒤 그 안에 record 라는 것은, 행에 있는 데이터를 가르킨다 볼 수 있다.

primary Key : 각 테이블에는 고유한 ID라는 필드가 있다.
보통은 자동적으로 값이 증가합니다. ex) CustmoerId, EmployeeId

foreign key : 다른 테이블에서 테이블의 기본키를 참조할때 해당 값을 외래키라고한다.
ex) SupportRepId 가 EmployeeId를 사용중

1:1, 1:N, N:N 의 경우에 따라 설계하는 방법들이 달라진다.

1:1 관계
하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우이다.
위와 같은 관계는 자주 사용하지는 않는다.
1:1로 관계져있다는 것은 단한명의 엔티티와 단하나의 엔티티가 연결되어 있다는 뜻 이된다.






만약 1:1로 연결한다면 위와같이 고객 엔티티에

주문 Id를 참조시켜도된다. 하지만 Order의 내용으로 직접 저장하는게 나을 수 있다.

1:N 관계
1:N의 관계에서는 N인 쪽에다가 1을 참조하는 식으로 작성하는게 합리적이다.
이유는 아래에서 알아보자

Phone_Id Phone_number
1 010-1234-1111
2 010-1234-1112
3 010-1234-1113
4 010-1234-1114
5 010-1234-1115
User_Id name Phone_Id
1 홍길동 1, 4
2 남상길 2
3 공갈빵 3, 5

위와 같이 2개의 테이블이 있다고 가정하였을떄
데이터를 관리하게될 경우에
세상에 전화번호가 하나밖에 없다고 가정하고
홍길동이란 사람은 1번과 4번에 해당하는 번호를 가지고있고
공갈빵이란 사람은 3번과 5번에 해당하는 번호를 가지고있다.

한사람이 번호를 N개만큼 가질 수 있는 것이다.
즉, 1 = User / Phone = N 이 되게 되어진다. 1:N에 성립하며
위에서 나올 수 있는 문제를 알아보자

1). N개만큼. 즉 홍길동이란 사람의 Phone_number 최댓값을 알 수 없다.
-> 배열처럼 길이를 지정해줘야하는데 최대크기를 알 수 가 없으니 문제가 된다.

2). 시간 복잡도가 늘어난다.
-> 우리가 데이터를 찾을때 홍길동이란사람을 찾고 그후 Phone 테이블에서 1번과 4번에

해당하는 데이터를 찾아줘야하기 때문이다.
그렇다면 아래와 같이 데이터베이스를 관리할 수도 있다.

User_Id name Phone_Id
1 홍길동 1
2 남상길 2
3 공갈빵 3
4 홍길동 4
5 공갈빵 5

하지만 여기서 문제점은.
홍길동이라는 사람이 개명을 했다고 가정하면
우리는 해당 테이블의 홍길동을 전부 바꿔줘야한다.
혹여나 프로그램 실수로 데이터를 못바뀌는 경우가 생기면
큰 문제가 발생하게된다. 이런문제를 정합성이 깨진다고하며
소스는 한군데에서 관리가 되어야 된다는 결과에 도달한다.

User_Id name
1 홍길동
2 남상길
3 공갈빵
Phone_Id Phone_number User_Id
1 010-1234-1111 1
2 010-1234-1112 2
3 010-1234-1113 3
4 010-1234-1114 1
5 010-1234-1115 3

위와 같이 관리를 한다고 가정하면
소스가 한군데에서 관리가 된다고 볼 수 있다.

홍길동이란 유저의 이름이 바뀌어도
해당 소스를 수정할 필요도 없고, 탐색도 Phone Table만
탐색하여도 해당 번호에 어떤사람이 이용하는지 알 수 있다.
아래와 같이 ERD를 작성해 볼 수 있다.









N:N 관계 (다:다)

다대다 관계는 Join Table을 만들어서 관리해줄 수 있다.
하나의 고객이 커피를 여러개 시킬 수도 있고
하나의 커피를 여러 고객이 시킬 수도 있기 때문이다.
이런관계를 N:N 관계라고하며, 아래와 같이 ERD를 작성해 볼 수있다.















오늘은 테이블의 관계과 설계에 대해 간단하게 알아보았다.
이 부분들은 꽤나 중요한 부분이라 생각들고
한번에 설계에 대한 이해를 하긴 어려울 것 같다는 생각이 들었다..
지속적인 연습과 학습이 필요해보인다.

오늘 공부는 여기서 끝!!


오늘의 커피량: ☕️ ☕️
오늘의 점심: 간장계란밥, 만두