당근마켓의 데이터베이스를 클론해보자!
당근마켓 DB 설계
공간데이터를 많이 다루는 과 특성상 빅데이터를 많이 다루기는 하지만 그런 데이터들은 실제 서비스에서처럼 많은 관계를 갖고있지는 않다. 따라서 관계형 데이터베이스를 이해하고 실습하기위해 당근마켓의 데이터베이스를 클론해보자.
대상을 당근마켓으로 정한 이유는 플렛폼 어플리케이션에서 사용하는 기능이 대부분 들어있기 때문이다.
채팅은 socket을 사용하겠지만 DB 공부가 목적이니 데이터베이스로 구현했다.
당근마켓 클론의 전체적인 진행 상황이 궁금하시다면 이 글에서 확인 하실 수 있습니다!
ERD
학교에서는 ER win을 사용했었다. 이번에는 Quick DBD라는 툴을 사용했 것이다.
+ 수정 (2021.10.05)
수정사항
(1) 주소
원래는 User 에만 연결되어있던 Address1을 Product, Post, AdPost에 모두 연결해줬다. 이유는 Product로 예를 들면 내 지역주변의 Product를 검색하려면 Product와 연결된 Address1이 필요하다. 처음에는 Product의 판매자의 주소를 가져올 생각으로 주소컬럼을 따로 만들지 않았다. 하지만 판매자의 주소는 address와 subAddress로 최대 두개다. Product의 판매지역을 가져올때 User의 address컬럼의 값을 가져와야 하는지 subAddress값을 가져와야 하는지 알 수없다. 그래서 각각 테이블에 location컬럼을 만들어 Address1테이블과 연결해줬다.
(2) 사진
원래는 모든 사진을 Photo 테이블에 Product, Post와 같이 여러 사진을 올려 1:N일경우 중간에 ProductPhoto, PostPhoto 와같은 테이블을 만들어 연결했고 프로필 사진처럼 사진을 한장만 올리는 User의 경우 직접 Photo를 참조했다. 이렇게 되면 검색할때 어렵고 사진의 상태값을 저장할 수 없었다. Photo테이블에 createdAd, status컬럼을 넣지 않은 이유는 중간테이블에서 저장하기 때문이었는데 User-Photo의 경우 중간테이블이 없어 상태를 저장할 수 없고 프로필사진을 바꾸면 기존의 프로필 사진은 아무도 참조하지 않아 PK로 직접 접근해야만 접근 가능한 데이터가 된다. 따라서 사진을 필요로하는 각각의 테이블마다 사진을 저장하는 테이블을 만들어 각각 연결해줬다. 당근마켓의 댓글에는 사진이 한장만 첨부 가능하다. 그래서 댓글 테이블은 각각 사진 테이블을 붙이지 않고 CommentPhoto테이블을 만들어 참조하게 했다. 지금 글을 쓰면서 든 생각인데 사진과 같은 테이블은 FK를 사진 테이블에 둬야 좋을 것 같다. 데이터의 흐름을 한 방향으로 정하고 설계하는게 쿼리를 짤때 편할 것 같다. 뿌리 쪽에 FK를 두고 줄기 쪽을 참조할 지 줄기 쪽에 FK를 두고 뿌리쪽을 참조할 지 한 방향으로 정하는게 좋아보인다. 고민이 필요하다.
(3) 채팅방 메세지
한방쿼리를 짜다 채팅방에서 막혀 그만뒀었다. 내가 쿼리를 짜는 실력 부족도 있지만 채팅 쿼리를 짜면서 ERD설계가 한참 잘못 됐음을 느꼈다. 우선 message는 발신자와 채팅방만 알면된다. 이전 ERD에서는 채팅방에 참여자 정보를 담지 않고 메세지에 발신자와 수신자 컬럼을 만들었었다. 당근마캣의 채팅방은 1:1만 가능하다고 가정했고 참여자 두명에 대한 정보는 꼭 필요한데 메세지 테이블에 발신자 컬럼은 필수이니 메세지 테이블에 발신자, 수신자 컬럼을 넣으면 채팅방에는 참여자 정보를 넣지 않아도 되고 결론적으로 참여자 두명의 정보를 2개의 컬럼으로 담을 수 있다는 생각이었다. 만약 채팅방에 참여자 두명의 정보를 담으면 메세지 테이블에 발신자 컬럼은 필수이니 참여자 2명의 정보를 3개의 컬럼에 저장해 중복이 발생된다는 논리였다. 하지만 이렇게되면 나중에 단톡방을 만들 때 확장성이 떨어진다. 채팅방에 참여자 정보를 저장하면 단톡방을 만들어도 구조가 변하지 않지만 메세지에 참여자를 저장하면 단톡방은 거의 불가능해진다. 그래서 채팅방과 메세지 태이블의 구조를 바꿨다.
(4) 오타 수정
createdAt을 모두 ceratedAt이라고 썼다. Quick DBD는 모두 타이핑으로 만들게 되는데 거의 모든 테이블에 들어가는 createdAt, updatedAt, status컬럼은 모두 복사 붙여넣기를 했다. 처음 하나 틀리니 뒤에도 다 틀렸다. 이런거 고칠때 꿀팁은 cmd+A(ctrl+A)로 전체선택 -> 복사 -> vs code에 붙여넣기 -> 고치고 싶은 단어 드래그 -> cmd+Shift+L 하면 모든 단어가 선택되어 한번에 고칠 수 있다.
하나하나 캡쳐해서 설명하고 싶지만.... 너무 오래 걸릴 것 같아서....너무 불친절하지만 SQL코드로.... 참조 관계는 아래에 몰려있습니다.
CREATE TABLE `User` (
`userIdx` int NOT NULL AUTO_INCREMENT,
`userId` varchar(45) NOT NULL ,
`userPw` varchar(60) NOT NULL ,
`userName` varchar(24) NOT NULL ,
`userNickName` varchar(24) NOT NULL ,
`address` int NOT NULL ,
`subAddress` int NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`userIdx`
),
CONSTRAINT `uc_User_userId` UNIQUE (
`userId`
),
CONSTRAINT `uc_User_userNickName` UNIQUE (
`userNickName`
)
);
CREATE TABLE `UserPhoto` (
`userIdx` int NOT NULL AUTO_INCREMENT,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`userIdx`
)
);
CREATE TABLE `UserBadge` (
`userIdx` int NOT NULL ,
`badgeIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `Badge` (
`badgeIdx` int NOT NULL AUTO_INCREMENT,
`badgeName` varchar(32) NOT NULL ,
PRIMARY KEY (
`badgeIdx`
)
);
CREATE TABLE `Follow` (
`followerIdx` int NOT NULL ,
`followingIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `KeywordUser` (
`userIdx` int NOT NULL ,
`keywordIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `Keyword` (
`keywordIdx` int NOT NULL AUTO_INCREMENT,
`keyword` varchar(66) NOT NULL ,
PRIMARY KEY (
`keywordIdx`
)
);
CREATE TABLE `Product` (
`productIdx` int NOT NULL AUTO_INCREMENT,
`location` int NOT NULL ,
`title` text NOT NULL ,
`content` text NOT NULL ,
`Price` int NOT NULL ,
`sellerIdx` int NOT NULL ,
`category` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`productIdx`
)
);
CREATE TABLE `ProductPhoto` (
`productphotoIdx` int NOT NULL AUTO_INCREMENT,
`productIdx` int NOT NULL ,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`productphotoIdx`
)
);
CREATE TABLE `Post` (
`postIdx` int NOT NULL AUTO_INCREMENT,
`location` int NOT NULL ,
`title` text NOT NULL ,
`content` text NOT NULL ,
`writerIdx` int NOT NULL ,
`category` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`postIdx`
)
);
CREATE TABLE `PostPhoto` (
`postphotoIdx` int NOT NULL AUTO_INCREMENT,
`postIdx` int NOT NULL ,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`postphotoIdx`
)
);
CREATE TABLE `AdPost` (
`adPostIdx` int NOT NULL AUTO_INCREMENT,
`location` int NOT NULL ,
`title` text NOT NULL ,
`content` text NOT NULL ,
`price` int NOT NULL ,
`phone` varchar(24) NOT NULL ,
`writerIdx` int NOT NULL ,
`category` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`adPostIdx`
)
);
CREATE TABLE `AdPostPhoto` (
`adPostphotoIdx` int NOT NULL AUTO_INCREMENT,
`adPostIdx` int NOT NULL ,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`adPostphotoIdx`
)
);
CREATE TABLE `ProductCategories` (
`categoryIdx` int NOT NULL AUTO_INCREMENT,
`category` varchar(20) NOT NULL ,
PRIMARY KEY (
`categoryIdx`
)
);
CREATE TABLE `PostCategories` (
`categoryIdx` int NOT NULL AUTO_INCREMENT,
`category` varchar(20) NOT NULL ,
PRIMARY KEY (
`categoryIdx`
)
);
CREATE TABLE `AdPostCategories` (
`categoryIdx` int NOT NULL AUTO_INCREMENT,
`category` varchar(20) NOT NULL ,
PRIMARY KEY (
`categoryIdx`
)
);
CREATE TABLE `MannersCategories` (
`categoryIdx` int NOT NULL AUTO_INCREMENT,
`category` varchar(40) NOT NULL ,
PRIMARY KEY (
`categoryIdx`
)
);
CREATE TABLE `ProductViews` (
`productIdx` int NOT NULL ,
`userIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`count` tinyint NOT NULL
);
CREATE TABLE `PostViews` (
`postIdx` int NOT NULL ,
`userIdx` int NOT NULL ,
`ceratedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`count` tinyint NOT NULL
);
CREATE TABLE `AdPostViews` (
`adPostIdx` int NOT NULL ,
`userIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`count` tinyint NOT NULL
);
CREATE TABLE `Deal` (
`dealIdx` int NOT NULL AUTO_INCREMENT,
`productIdx` int NOT NULL ,
`buyerIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`dealIdx`
)
);
CREATE TABLE `ProductChatRoom` (
`chatRoomIdx` int NOT NULL AUTO_INCREMENT,
`productIdx` int NOT NULL ,
`member` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`chatRoomIdx`
)
);
CREATE TABLE `AdPostChatRoom` (
`chatRoomIdx` int NOT NULL AUTO_INCREMENT,
`adPostIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`chatRoomIdx`
)
);
CREATE TABLE `ProductMessage` (
`messageIdx` int NOT NULL AUTO_INCREMENT,
`chatRoomIdx` int NOT NULL ,
`senderIdx` int NOT NULL ,
`chat` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`messageIdx`
)
);
CREATE TABLE `ProductMessagePhoto` (
`photoIdx` int NOT NULL AUTO_INCREMENT,
`messegaIdx` int NOT NULL ,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`photoIdx`
)
);
CREATE TABLE `AdPostMessage` (
`MessageIdx` int NOT NULL AUTO_INCREMENT,
`chatRoomIdx` int NOT NULL ,
`senderIdx` int NOT NULL ,
`text` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`MessageIdx`
)
);
CREATE TABLE `AdPostMessagePhoto` (
`photoIdx` int NOT NULL AUTO_INCREMENT,
`messageIdx` int NOT NULL ,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`photoIdx`
)
);
CREATE TABLE `Manners` (
`takerIdx` int NOT NULL ,
`giverIdx` int NOT NULL ,
`dealIdx` int NOT NULL ,
`categoryIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `DealReview` (
`takerIdx` int NOT NULL ,
`giverIdx` int NOT NULL ,
`dealIdx` int NOT NULL ,
`text` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `LikeProductCategories` (
`userIdx` int NOT NULL ,
`pdtCategoryIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `LikePostCategories` (
`userIdx` int NOT NULL ,
`pstCategoryIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `LikeProduct` (
`userIdx` int NOT NULL ,
`productIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `LikeAdPost` (
`userIdx` int NOT NULL ,
`AdPostIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `LikePost` (
`userIdx` int NOT NULL ,
`postIdx` int NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL
);
CREATE TABLE `PostComment` (
`commentIdx` int NOT NULL AUTO_INCREMENT,
`writerIdx` int NOT NULL ,
`targetIdx` int NOT NULL ,
`text` text NOT NULL ,
`photoIdx` int NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`commentIdx`
)
);
CREATE TABLE `AdPostComment` (
`commentIdx` int NOT NULL AUTO_INCREMENT,
`writerIdx` int NOT NULL ,
`targetPostIdx` int NULL ,
`text` text NOT NULL ,
`photoIdx` int NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`commentIdx`
)
);
CREATE TABLE `CommentComment` (
`commentIdx` int NOT NULL AUTO_INCREMENT,
`writerIdx` int NOT NULL ,
`PostcommentIdx` int NOT NULL ,
`AdPostcommentIdx` int NOT NULL ,
`text` text NOT NULL ,
`photoIdx` int NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`commentIdx`
)
);
CREATE TABLE `CommentPhoto` (
`photoIdx` int NOT NULL AUTO_INCREMENT,
`photo` text NOT NULL ,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT current_timestamp on update current_timestamp,
`status` char(1) NOT NULL ,
PRIMARY KEY (
`photoIdx`
)
);
CREATE TABLE `Address1` (
`address1Idx` int NOT NULL AUTO_INCREMENT,
`address2Idx` int NOT NULL ,
`name` varchar(16) NOT NULL ,
PRIMARY KEY (
`address1Idx`
)
);
CREATE TABLE `Address2` (
`address2Idx` int NOT NULL AUTO_INCREMENT,
`address3Idx` int NOT NULL ,
`name` varchar(16) NOT NULL ,
PRIMARY KEY (
`address2Idx`
)
);
CREATE TABLE `Address3` (
`address3Idx` int NOT NULL AUTO_INCREMENT,
`address4Idx` int NOT NULL ,
`name` varchar(16) NOT NULL ,
PRIMARY KEY (
`address3Idx`
)
);
CREATE TABLE `Address4` (
`address4Idx` int NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL ,
PRIMARY KEY (
`address4Idx`
)
);
ALTER TABLE `User` ADD CONSTRAINT `fk_User_address` FOREIGN KEY(`address`)
REFERENCES `Address1` (`address1Idx`);
ALTER TABLE `User` ADD CONSTRAINT `fk_User_subAddress` FOREIGN KEY(`subAddress`)
REFERENCES `Address1` (`address1Idx`);
ALTER TABLE `UserPhoto` ADD CONSTRAINT `fk_UserPhoto_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `UserBadge` ADD CONSTRAINT `fk_UserBadge_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `UserBadge` ADD CONSTRAINT `fk_UserBadge_badgeIdx` FOREIGN KEY(`badgeIdx`)
REFERENCES `Badge` (`badgeIdx`);
ALTER TABLE `Follow` ADD CONSTRAINT `fk_Follow_followerIdx` FOREIGN KEY(`followerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `Follow` ADD CONSTRAINT `fk_Follow_followingIdx` FOREIGN KEY(`followingIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `KeywordUser` ADD CONSTRAINT `fk_KeywordUser_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `KeywordUser` ADD CONSTRAINT `fk_KeywordUser_keywordIdx` FOREIGN KEY(`keywordIdx`)
REFERENCES `Keyword` (`keywordIdx`);
ALTER TABLE `Product` ADD CONSTRAINT `fk_Product_location` FOREIGN KEY(`location`)
REFERENCES `Address1` (`address1Idx`);
ALTER TABLE `Product` ADD CONSTRAINT `fk_Product_sellerIdx` FOREIGN KEY(`sellerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `Product` ADD CONSTRAINT `fk_Product_category` FOREIGN KEY(`category`)
REFERENCES `ProductCategories` (`categoryIdx`);
ALTER TABLE `ProductPhoto` ADD CONSTRAINT `fk_ProductPhoto_productIdx` FOREIGN KEY(`productIdx`)
REFERENCES `Product` (`productIdx`);
ALTER TABLE `Post` ADD CONSTRAINT `fk_Post_location` FOREIGN KEY(`location`)
REFERENCES `Address1` (`address1Idx`);
ALTER TABLE `Post` ADD CONSTRAINT `fk_Post_writerIdx` FOREIGN KEY(`writerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `Post` ADD CONSTRAINT `fk_Post_category` FOREIGN KEY(`category`)
REFERENCES `PostCategories` (`categoryIdx`);
ALTER TABLE `PostPhoto` ADD CONSTRAINT `fk_PostPhoto_postIdx` FOREIGN KEY(`postIdx`)
REFERENCES `Post` (`postIdx`);
ALTER TABLE `AdPost` ADD CONSTRAINT `fk_AdPost_location` FOREIGN KEY(`location`)
REFERENCES `Address1` (`address1Idx`);
ALTER TABLE `AdPost` ADD CONSTRAINT `fk_AdPost_writerIdx` FOREIGN KEY(`writerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `AdPost` ADD CONSTRAINT `fk_AdPost_category` FOREIGN KEY(`category`)
REFERENCES `AdPostCategories` (`categoryIdx`);
ALTER TABLE `AdPostPhoto` ADD CONSTRAINT `fk_AdPostPhoto_adPostIdx` FOREIGN KEY(`adPostIdx`)
REFERENCES `AdPost` (`adPostIdx`);
ALTER TABLE `ProductViews` ADD CONSTRAINT `fk_ProductViews_productIdx` FOREIGN KEY(`productIdx`)
REFERENCES `Product` (`productIdx`);
ALTER TABLE `ProductViews` ADD CONSTRAINT `fk_ProductViews_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `PostViews` ADD CONSTRAINT `fk_PostViews_postIdx` FOREIGN KEY(`postIdx`)
REFERENCES `Post` (`postIdx`);
ALTER TABLE `PostViews` ADD CONSTRAINT `fk_PostViews_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `AdPostViews` ADD CONSTRAINT `fk_AdPostViews_adPostIdx` FOREIGN KEY(`adPostIdx`)
REFERENCES `AdPost` (`adPostIdx`);
ALTER TABLE `AdPostViews` ADD CONSTRAINT `fk_AdPostViews_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `Deal` ADD CONSTRAINT `fk_Deal_productIdx` FOREIGN KEY(`productIdx`)
REFERENCES `Product` (`productIdx`);
ALTER TABLE `Deal` ADD CONSTRAINT `fk_Deal_buyerIdx` FOREIGN KEY(`buyerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `ProductChatRoom` ADD CONSTRAINT `fk_ProductChatRoom_productIdx` FOREIGN KEY(`productIdx`)
REFERENCES `Product` (`productIdx`);
ALTER TABLE `ProductChatRoom` ADD CONSTRAINT `fk_ProductChatRoom_member` FOREIGN KEY(`member`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `AdPostChatRoom` ADD CONSTRAINT `fk_AdPostChatRoom_adPostIdx` FOREIGN KEY(`adPostIdx`)
REFERENCES `AdPost` (`adPostIdx`);
ALTER TABLE `ProductMessage` ADD CONSTRAINT `fk_ProductMessage_chatRoomIdx` FOREIGN KEY(`chatRoomIdx`)
REFERENCES `ProductChatRoom` (`chatRoomIdx`);
ALTER TABLE `ProductMessage` ADD CONSTRAINT `fk_ProductMessage_senderIdx` FOREIGN KEY(`senderIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `ProductMessagePhoto` ADD CONSTRAINT `fk_ProductMessagePhoto_messegaIdx` FOREIGN KEY(`messegaIdx`)
REFERENCES `ProductMessage` (`messageIdx`);
ALTER TABLE `AdPostMessage` ADD CONSTRAINT `fk_AdPostMessage_chatRoomIdx` FOREIGN KEY(`chatRoomIdx`)
REFERENCES `AdPostChatRoom` (`chatRoomIdx`);
ALTER TABLE `AdPostMessage` ADD CONSTRAINT `fk_AdPostMessage_senderIdx` FOREIGN KEY(`senderIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `AdPostMessagePhoto` ADD CONSTRAINT `fk_AdPostMessagePhoto_messageIdx` FOREIGN KEY(`messageIdx`)
REFERENCES `AdPostMessage` (`MessageIdx`);
ALTER TABLE `Manners` ADD CONSTRAINT `fk_Manners_takerIdx` FOREIGN KEY(`takerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `Manners` ADD CONSTRAINT `fk_Manners_giverIdx` FOREIGN KEY(`giverIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `Manners` ADD CONSTRAINT `fk_Manners_dealIdx` FOREIGN KEY(`dealIdx`)
REFERENCES `Deal` (`dealIdx`);
ALTER TABLE `Manners` ADD CONSTRAINT `fk_Manners_categoryIdx` FOREIGN KEY(`categoryIdx`)
REFERENCES `MannersCategories` (`categoryIdx`);
ALTER TABLE `DealReview` ADD CONSTRAINT `fk_DealReview_takerIdx` FOREIGN KEY(`takerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `DealReview` ADD CONSTRAINT `fk_DealReview_giverIdx` FOREIGN KEY(`giverIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `DealReview` ADD CONSTRAINT `fk_DealReview_dealIdx` FOREIGN KEY(`dealIdx`)
REFERENCES `Deal` (`dealIdx`);
ALTER TABLE `LikeProductCategories` ADD CONSTRAINT `fk_LikeProductCategories_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `LikeProductCategories` ADD CONSTRAINT `fk_LikeProductCategories_pdtCategoryIdx` FOREIGN KEY(`pdtCategoryIdx`)
REFERENCES `ProductCategories` (`categoryIdx`);
ALTER TABLE `LikePostCategories` ADD CONSTRAINT `fk_LikePostCategories_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `LikePostCategories` ADD CONSTRAINT `fk_LikePostCategories_pstCategoryIdx` FOREIGN KEY(`pstCategoryIdx`)
REFERENCES `PostCategories` (`categoryIdx`);
ALTER TABLE `LikeProduct` ADD CONSTRAINT `fk_LikeProduct_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `LikeProduct` ADD CONSTRAINT `fk_LikeProduct_productIdx` FOREIGN KEY(`productIdx`)
REFERENCES `Product` (`productIdx`);
ALTER TABLE `LikeAdPost` ADD CONSTRAINT `fk_LikeAdPost_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `LikeAdPost` ADD CONSTRAINT `fk_LikeAdPost_AdPostIdx` FOREIGN KEY(`AdPostIdx`)
REFERENCES `AdPost` (`adPostIdx`);
ALTER TABLE `LikePost` ADD CONSTRAINT `fk_LikePost_userIdx` FOREIGN KEY(`userIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `LikePost` ADD CONSTRAINT `fk_LikePost_postIdx` FOREIGN KEY(`postIdx`)
REFERENCES `Post` (`postIdx`);
ALTER TABLE `PostComment` ADD CONSTRAINT `fk_PostComment_writerIdx` FOREIGN KEY(`writerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `PostComment` ADD CONSTRAINT `fk_PostComment_targetIdx` FOREIGN KEY(`targetIdx`)
REFERENCES `Post` (`postIdx`);
ALTER TABLE `PostComment` ADD CONSTRAINT `fk_PostComment_photoIdx` FOREIGN KEY(`photoIdx`)
REFERENCES `CommentPhoto` (`photoIdx`);
ALTER TABLE `AdPostComment` ADD CONSTRAINT `fk_AdPostComment_writerIdx` FOREIGN KEY(`writerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `AdPostComment` ADD CONSTRAINT `fk_AdPostComment_targetPostIdx` FOREIGN KEY(`targetPostIdx`)
REFERENCES `AdPost` (`adPostIdx`);
ALTER TABLE `AdPostComment` ADD CONSTRAINT `fk_AdPostComment_photoIdx` FOREIGN KEY(`photoIdx`)
REFERENCES `CommentPhoto` (`photoIdx`);
ALTER TABLE `CommentComment` ADD CONSTRAINT `fk_CommentComment_writerIdx` FOREIGN KEY(`writerIdx`)
REFERENCES `User` (`userIdx`);
ALTER TABLE `CommentComment` ADD CONSTRAINT `fk_CommentComment_PostcommentIdx` FOREIGN KEY(`PostcommentIdx`)
REFERENCES `PostComment` (`commentIdx`);
ALTER TABLE `CommentComment` ADD CONSTRAINT `fk_CommentComment_AdPostcommentIdx` FOREIGN KEY(`AdPostcommentIdx`)
REFERENCES `AdPostComment` (`commentIdx`);
ALTER TABLE `CommentComment` ADD CONSTRAINT `fk_CommentComment_photoIdx` FOREIGN KEY(`photoIdx`)
REFERENCES `CommentPhoto` (`photoIdx`);
ALTER TABLE `Address1` ADD CONSTRAINT `fk_Address1_address2Idx` FOREIGN KEY(`address2Idx`)
REFERENCES `Address2` (`address2Idx`);
ALTER TABLE `Address2` ADD CONSTRAINT `fk_Address2_address3Idx` FOREIGN KEY(`address3Idx`)
REFERENCES `Address3` (`address3Idx`);
ALTER TABLE `Address3` ADD CONSTRAINT `fk_Address3_address4Idx` FOREIGN KEY(`address4Idx`)
REFERENCES `Address4` (`address4Idx`);
'Toy Projects > 당근마켓 클론' 카테고리의 다른 글
[당근마켓] README (2) | 2021.11.16 |
---|---|
[당근마켓/데이터베이스] 당근마켓 한방쿼리 feat. SQL (2) | 2021.10.04 |