새 프로젝를 시작하면서 erd부터 작성하고 있었다. 좋아요 테이블을 설계하는 과정에서 생긴 문제점과 과정을 적어본다.
먼저 게시판 테이블을 만들고 그 후 좋아요 기능을 위해 추가로 연관 테이블을 만들었다(유저 테이블은 설명을 위해 생략).

그 후에 게시판 댓글 테이블을 만드는데 여기서도 좋아요 기능이 있어서 테이블이 다음과 같이 나왔다.

여기까지 만들고 보니까 같은 좋아요 기능을 하는 테이블이 두 개가 존재하였다. 이후에 다른 게시판에도 좋아요 기능을 넣을 예정이라 그 때마다 "좋아요 테이블을 따로 추가해야 하나?" 라는 생각이 들었다. 테이블이 늘어나면 비지니스 코드를 짤때도 복잡함이 늘어나 마음에 들지 않았다. 그래서 저 두개의 좋아요 테이블을 합치기로 하였다.

합치고 나니 이번엔 원래는 외래키가 하나였으나 2개로 늘어났다. 이것도 역시 두 가지 문제점 있었는다.
그래서 다시 한번 수정을 했다.
관련 테이블이 늘어날때 마다 외래키가 증가하니 외래키를 제거했고 기존에 외래키 컬럼으로 대상 테이블을 구분하는 대신 엔티티 타입 필드를 추가해 테이블을 구별했고 테이블의 ID는 한개의 컬럼만 남겼다. 최종적으로 다음과 같은 모습이 돼었다.

기존에는 외래키로 인해 참조 무결성이 보장 되었지만 외래키를 제거해 보장할 수 없게 되었다. 하지만 비즈니스 코드에서 좋아요 레코드를 추가,삭제 할때 엔티티 테이블의 기본키를 체크하는 로직을 추가하고 게시판, 댓글의 레코드를 삭제할 때 관련된 좋아요 레코드를 삭제하게 구현하면 문제가 해결 된다. 물론 이 과정을 트랜잭션 단위로 처리해야한다.