인프런 커뮤니티 질문&답변

ts님의 프로필 이미지
ts

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

다름이 아니라 DB 설계 관련 질문이 있습니다.

작성

·

440

0

 

안녕하세요 강의 잘보고 있습니다!

DB 관련해서 제가 몇가지 궁금한게 있는데

1. 

예를 들어 하나의 테이블에서 다 대 다일때 즉 user 와 user에 다대다 일때 

중간테이블 follow를 만들어주지 않고 한 User 테이블에 컬럼을 늘리는건 별로 안좋은 방식인가요?

예를 들어서 follow 테이블을 만들지 않고 User 테이블안에 팔로우, 팔로잉 수 컬럼을 넣는 방식

 

2. 다 대 다 관계일시 중간테이블 관련

다 대 다 관계일시 데이터베이스 이론적으로는 중간테이블을 만드는걸로 저도 배우긴 했는데

근데 이게 프로그래밍 관점에서 테이블을 너무 많이 늘리고 join이 많아질시 성능이 안좋다고 배웠던 기억이 있어서요

그래서 이게 실무에서도 다대다일시 중간테이블로 쪼개고 join을 자주 발생시키는지 궁금해요 

로그인 같은경우에도 팔로우,잉,쓴글갯수를 유지하기 위해

로그인을 할때마다 post 테이블 follow 테이블 과의 3개의 테이블을 조인시켜서 select 하는 경우인데

과연 이런식의 3중조인을 로그인할때마다 해줘야 하는건가에 대한 생각 꼭 조인을 이렇게 많이해야 저 데이터를 가지고 올 수있나에 대한 DB설계에 대한 생각이 공존합니다. 아니면 제가 너무 오버하는 것일지 문제가 되지 않는 것인지...

그래서 실제로도 실무에서도 이런식으로 중간테이블과 db설계관련 또한 그걸로 인한 많은 join 관련해서 궁금하네요 

++ 제가 이런 생각이 든 이유가

게시판을 만들때 게시물 상세 페이지에 파일갯수랑, 댓글 갯수를 게시물 리스트에 명시해주는 로직을 짜다가 

join 몇번해서 select 해서 가져와보자 했는데..  다른분께서 이유는 말안하셨지만 join 그렇게 하지말라고 하셨거든요

그래서 그래서 게시물 DB에 갯수에 대한 컬럼을 늘려서  게시물 상세페이지 작성시 댓글, 파일 insert 할때 게시물 db에 갯수counting 해서 insert 하고 조인 없이 list 뿌려지는 형태로 바꿨거든요 그게 생각이나서요(insert 시 다른 db에는 count+1 insert 한 동작에 각 테이블의 2번의 insert 작업)

3. db 생성시

post.js user.js -> 실 테이블 posts, users 뒤에 s가 붙는데 이건 왜 붙는건 가요?

 

제가 실무 경험이 없어서 꼭 알고 싶은 포인트입니다..

** 질문이 많은데 읽어주셔서 감사합니다.

답변 1

2

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

1. 팔로우, 팔로잉 수만 넣는다면 누가 누구를 팔로잉했는지는 어떻게 관리하실건가요?

2. 이게 조인도 여러가지가 있는데요. 게시글 -> A -> B 이런 삼단구조인 것과, 게시글 -> 팔로워, 게시글 -> 팔로잉 이렇게 테이블은 3개여도 2단 구조인 것이 있습니다. 후자가 성능적으로 훨씬 더 좋습니다.

일단 원칙적으로 정규화 원칙을 따르고 중간에 성능 문제가 생기면 역정규화(예시로 드신 카운트 개수 컬럼 만드는 식)로 원칙을 깨는 게 좋습니다. DB가 정규화 잘 해놓고 인덱스만 잘 걸어두면 생각보다 엄청나게 성능이 좋습니다. 웬만한 조인으로는 성능 문제 안 생깁니다.

3. 시퀄라이즈의 규칙입니다.

ts님의 프로필 이미지
ts
질문자

답변 감사합니다. 조인관련해서 조금 더 공부해보겠습니다.

ts님의 프로필 이미지
ts

작성한 질문수

질문하기