프로젝트/인스타그램 클론코딩

인스타그램 ERD 설계

김긍수 2021. 5. 17. 00:09

3주차에는 ERD를 설계하고 SQL쿼리를 작성하며 데이터베이스를 다루는 과제가 주어졌다.

그러기위해선 어떤 어플을 만들지 결정해야했는데 나는 '인스타그램' 을 선택했다.

 

ERD설계는 AQueryTool을 사용하였고 데이터베이스는 MySQL을 사용하였다.

 

 

인스타그램 ERD 설계

인스타그램의 화면대로 설계해보았다. 당연히 모든 인스타그램을 구현한 것은 아니고 핵심이 되는 부분 정도만 뽑았다고 보면 된다. 실제 인스타그램과 똑같이 구현하려면 더 많은 테이블과 더 많은 컬럼이 필요할 것 이다.

 

 


인스타그램 ERD 설계 후 작성한 쿼리들

1. 메인 화면 상단 인스타 스토리

-- 상단 인스타스토리
SELECT User.userId, User.profileUrl, Story.idx AS storyIdx
FROM User Inner Join Story ON User.idx = Story.userIdx
WHERE Story.status = 'ACTIVE' AND Story.userIdx In (
	SELECT followingUserIdx
    From Follow
    Where Follow.userIdx = 1)    
ORDER BY Story.createdAt DESC;

메인화면 상단 인스타스토리는 로그인유저가 팔로우한 유저들의 최신 스토리가 보이게 된다.

필요한 데이터는 userId, userProfileUrl, StoryIdx이다.

때문에 User와 Story를 조인시켜주었고 IN 구문을 이용해 내가 팔로우한 유저들의 인스타스토리 목록을 가져왔다.

순서는 최신순이므로 DESC.

 

2. 메인 피드

-- 쿼리 최적화가 필요하다. 수정 후 업로드 예정

메인 피드에서는 작성유저의 profileUrl, userId, ImageUrl, imageCount, likeCount, commentCount, liked 구분 값이 필요하다.

먼저 이미지는 최대 10장이므로 메인피드를 위한 쿼리에서 한방에 가져올 수 없다.

따라서 게시글 마다 이미지를 가져오는 Query 1개, 최신 게시글을 가져오는 Query 1개가 필요했다.

 

 

3. 유저 프로필

-- 유저 프로필
SELECT userId, name, profileUrl, websiteUrl, introduction,
	(SELECT FORMAT(count(*), '#,#') FROM Post WHERE Post.userIdx = User.idx) AS '게시물',
	(SELECT count(*) FROM Follow WHERE User.idx = Follow.followingUserIdx) AS '팔로워',
    (SELECT FORMAT(count(*), '#,#') FROM Follow WHERE User.idx = Follow.userIdx) AS '팔로잉'
FROM User 
WHERE User.idx = 1;

유저 프로필은 인스타그램에서 유저 사진 혹은 ID를 누르면 보이는 화면이다.

그 중에 상단에 위치한 유저 프로필이다.

 

... 추가예정