리트윗은 테이블, 답글과 인용은 컬럼
답글과 인용은 본문이 있어서 트윗이 가진 모든 것 — 미디어, 해시태그, 자기 답글 — 이 필요합니다. 포인터 컬럼 하나씩만 더하면 트윗으로 둘 수 있습니다. 반면 그냥 리트윗은 담을 것이 없습니다. 트윗으로 만들면 본문이 null 인 행이 생겨 모든 타임라인 질의가 예외 처리를 해야 하고, 리트윗 취소가 "글로 보이던 것"의 삭제가 됩니다. 따로 두면 좋아요처럼 삽입과 삭제로 끝납니다.
사용자 계정, 트윗 콘텐츠, 미디어 첨부, 해시태그, 팔로우 관계, 좋아요, 리트윗, 알림, 다이렉트 메시지(DM) 및 실시간 트렌드를 포함하는 트위터/X 스타일의 마이크로블로깅 플랫폼용 전체 데이터베이스 스키마입니다.
트윗을 가리킬 수 있는 것이 셋인데, 이 스키마는 그 셋을 갈라 둡니다. 답글은 트윗 자신의 reply_to_id, 인용은 트윗 자신의 quote_tweet_id, 그냥 리트윗은 retweets 의 한 행입니다. 리트윗은 새 글을 만들지 않으므로 본문이 null 인 트윗이 되어서는 안 됩니다.
이 구분이 설계의 전부입니다. 답글과 인용은 트윗입니다 — 본문이 있고, 답글이 달리고, 작성자 타임라인에 뜹니다. 리트윗은 지지 표시라 글보다 좋아요에 가깝습니다. retweets.comment 는 인용까지 이쪽에 담고 싶을 때를 위해 남겨 둔 자리입니다.
타임라인에서 읽히는 값은 전부 트윗에 비정규화되어 있습니다 — retweet_count, like_count, reply_count, view_count. 그 숫자를 만드는 테이블도 그대로 있으므로, 카운터는 다시 계산할 수 있는 진실의 사본이지 진실 자체가 아닙니다.
답글과 인용은 본문이 있어서 트윗이 가진 모든 것 — 미디어, 해시태그, 자기 답글 — 이 필요합니다. 포인터 컬럼 하나씩만 더하면 트윗으로 둘 수 있습니다. 반면 그냥 리트윗은 담을 것이 없습니다. 트윗으로 만들면 본문이 null 인 행이 생겨 모든 타임라인 질의가 예외 처리를 해야 하고, 리트윗 취소가 "글로 보이던 것"의 삭제가 됩니다. 따로 두면 좋아요처럼 삽입과 삭제로 끝납니다.
지우지 않고 deleted_at 을 세웁니다. 트윗은 답글·인용·북마크·알림이 가리키고 있어서, 행을 지우면 답글까지 딸려 가거나 끊어진 포인터가 남습니다. 소프트 삭제면 스레드가 "삭제된 트윗" 자리를 남긴 채 유지되는데, 사람들이 기대하는 모습이 그것입니다.
trending_topics 를 비우고 다시 쓰지 않고 started_at·ended_at 을 둡니다. 트렌드 목록은 지나고 나서가 오히려 쓸모 있습니다 — 그 시각에 무슨 일이 있었는지를 답하는 자료입니다. 매 주기 덮어쓰면 그것이 사라집니다. rank 를 저장하는 이유도 같습니다. 랭킹 계산의 결과지 나중에 다시 구할 수 있는 값이 아닙니다.
list_members.added_by 가 있는 이유는 리스트가 공동 작업일 수 있기 때문입니다. 없으면 참여자를 뺄 때 그 사람이 넣은 멤버가 누구였는지 알 길이 없고, 리스트에 들어가고 싶지 않은 멤버에게 설명할 근거도 없습니다.