현재 링크드인에서 공개여부를 지정할 수 있는 부분은 총 3개로 1. 유저의 소개 정보, 연락정보, 경력정보 2. 글 작성 시 글 공개여부 3. 작성한 글에 달릴 댓글 공개 여부 정도로 나눠진다.
EX> 글작성 시 공개여부 UI
- 댓글을 비공개로 했을 때 UI
- 공개 여부에 따라 3가지 상태로 달라지는 '공개 상태' , 'public_status' 테이블을 만들어 컬럼으로 비공개, 친구에게만, 전체 유저에게를 만들어주어 boolean 형태로 값을 넣었습니다.
- 특정 부분(유저 정보, 글, 댓글 등)에 대한 공개 여부 범위를 결정하기 위해서 공개 범위 테이블, scope_of_public'을 만들었습니다.
- 'scope_of_public' 테이블의 컬럼으로 'public_status_id'(FK)를 만들어 "public_status" 테이블과 ''scope_of_public" 테이블이 1:1 관계로 참조하고 있습니다.
- public_status 테이블과 scope_of_public테이블 엑셀 표
따라서 public_status 테이블과 공개하고자 하는 정보의 테이블을 1:N 관계로 표현하면 다음과 같이 해당하는 정보에 대한 공개여부를 표현할 수 있을 것같다는 판단하에 공개하고자하는 정보 1. 유저의 소개 정보, 연락정보, 경력정보 2. 글 작성 시 글 공개여부까지는 1:N으로 매칭
- 결론적으로 포스트와 마찬가지로 댓글 역시 post에 포함된 영역이니 post 테이블에
post_scope_of_id
와 같이 'comment_scope_of_id'컬럼을 만들어 참조키로 scope_of_public 테이블과 1:N으로 넣어주어서 공개여부에 대한 관계를 만들었다.
ENUM 테이블로 관리하기⚙️
- 마찬가지로 ENUM을 통해 공개범위에 대한 상태를 넣어 이 id에 따라 비공개, 친구에게만, 전체 공개에 대한 구별을 해줄 수 있다.
- 또한 댓글 역시 post에 포함되므로 여기서 상태를 통해 댓글의 공개여부 또한 관리해줄 수 있다.
참고) db 다이어그램 url
ENUM을 사용해도 괜찮은 상황은 아래의 3가지로 좁혀진다.
- 유일하고 변하지 않는 값을 저장할 경우
- 절대로 연관된 정보를 저장할 필요가 없는 경우
- 두 개 초과 20개 이하의 값을 다룰 경우
따라서 ENUM 사용 문제는 개발/운영의 관점에서 적당한 합의점을 정해서 그에 따르면 되며 성능 문제는 그 문제가 수면 위로 떠오를 때 그 때 최적화를 진행하면 됩니다. 물론 그런 경우에도 참조 테이블 대신 ENUM 타입을 쓸 근거는 크게 없어인다.
2_1. 수정 전 ENUM 테이블
- 기존에는 다양한 정보(유저 정보 및 글과 댓글)들의 공개범위를 관리하는 테이블을 Prisma의 ENUM 테이블로 만들어서 관리해보았습니다.
2_2. 수정 전 참조 테이블
- 코드 리뷰를 받은 후 ENUM 테이블의 사용 문제는 개발/운영의 관점에서 적당한 합의점을 정해서 따르면 결정
되지만 참조 테이블 대신 ENUM 타입을 쓸 근거가 있어야한다는 피드백을 받았습니다.- 따라서 ENUM 테이블 대신 참조 관계를 맺어줌으로서 ENUM 테이블의 구조를 대체하여 리팩토링을 했습니다.
수정된 코드가, 이전보다 전체적으로 RDBS 데이터베이스의 특징을 살리면서 테이블 구조의 일관성 역시 유지할 수 있었으면서 Mysql에서 ENUM 테이블을 사용하는 경우에 대해 공부했던 기억이 있기에 기억에 남는 모델링으로 뽑았습니다.