개발 Q&A

제목 트위터 팔로윙 팔로워 시스템 DB
글쓴이 dataguru 작성시각 2012/07/30 12:35:04
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 26031   RSS
  트위터 팔로윙, 팔로워 같은 데이터베이스를 설계 할려고합니다. 

* 맞팔로워 인지 확인이 가능해야합니다. 
* 회원 탈퇴시 회원관계 데이터가 삭제 되야합니다. 

DB 설계 
회원 테이블 
1. 회원 주식별자 
2. 이름 
3. 로그인아이디 

회원관계 테이블 
1. 회원관계 주식별자 
2. 신청회원 주식별자 
3. 받는회원 주식별자 
4. 맞팔로워 구분값 : 0:팔로윙, 1:맞팔 

관계 
회원 테이블 : 회원관계 테이블 
              1 : N 
  
회원관계 테이블은 회원테이블의 자식 테이블입니다. 즉 회원테이블에서 데이터가 삭제 될시 회원관계 테이블 데이터도 삭제가 됩니다. delete cascade 

위 처럼 DB 설계를 해야 하는게 맞을까요 아니면 더 좋은 설계 방법이 있으면 조언해 주시면 감사 하겟습니다.
 다음글 db 연결이 안된다고 나오는데요; (3)
 이전글 검색시 한글 변환문제 (5)

댓글

니삼 / 2012/07/30 16:59:22 / 추천 0
그냥 서로 팔로윙 상태면 맞팔이 되는거 아닌가요? 따로 구분값이 필요한가요 음..
그것보다 우선 트위터는 관계형디비가 아니라 ..
그냥 지나가다 댓글 달아요 생각을 두고 읽진마세요 ..
변종원(웅파) / 2012/07/30 17:27:24 / 추천 0
니삼님 말씀처럼

맞팔인지 체크하는 쿼리가 조금 더 길어지겠지만 

a -> b 팔로윙
b -> a 팔로윙 

양방향 체크하는 것이 좋을 것 같습니다. 

위와 같은 로직일 경우 해당 로우가 없으면 팔로워가 아니고 있을 경우 상대방도 나를 팔로윙하고 있는지 체크만 하는게 좋을 것 같네요.
dataguru / 2012/07/31 13:34:57 / 추천 0
답변 감사합니다. 그런데 트위터가 mysql 을 사용하고 관계형 데이터베이스 인걸로 알고 있습니다. 제가 알고 있는게 틀린 건가요?? 그리고 맞팔로워 구분값은 웅파 님이 말씀 하신것 처럼 나를 팔로윙 하고 있는지 체크 하는 컬럼 입니다. 


0. user 는 회원정보를 담고 있습니다.
1. post 는 페이스북의 담벼락 같은 역할을 합니다.
2. comment 는 페이스북의 담벼락 게시물의 댓글 같은 역할을 합니다.
3. relation 은 페이스북의 친구관계를 뜻합니다.
 
 
ex) 1
user
uid, loginId, email,               password
1     A          A@email.com    a123
2     B          B@email.com    b123
3     C          C@email.com    c123
회원A ~ C 까지 있습니다.
relraion 
senduser_id, getuser_id
1                 2
2                 1
1                 3
A와 B는 서로 친구이며 현제 A가 C 에게 친구요청을 한 상태 입니다.
 
post
pid,     content,               user_user_id
1,        '난 A 입니다.',       1
2,        '난 B 입니다',        2
3,        '난 C 입니다,         3
회원 A ~ C 가 게시물을 작성 했습니다.
 
comment
cid, post_pid,  post_user_uid, text
1     1            2                     '안녕 A 댓글임'
2     2            1                     '안녕 B 댓글임'
회원 A ~ B 가 각각의 게시물에 댓글을 달았습니다.
 
relation, post, comment
위의 테이블은 참조 무결성을 지켜줘야 합니다. 즉 user 1번이 탈퇴하면 relation 테이블에서 senduser_id, getuser_id 컬럼에 1 이라는 데이터가 들어 있는 행을 삭제 해줘야합니다. 그리고 post, comment 도 user 컬럼에 1번이 들어간 행은 삭제 해줘야합니다. 그리고 comment 와 post 테이블과의 관계도 참조 무결성을 지켜줘야 하기때문에 post 행이 삭제 되면 comment 행도 삭제 되
어야 합니다.
 
ex) 2
user 1번이 탈퇴 했을때 아래와 같이 데이터가 삭제 되어야 합니다.
user
uid, loginId, email,               password
1     A          A@email.com    a123
2     B          B@email.com    b123
3     C          C@email.com    c123
user 1번이 삭제 됩니다.
relraion 
senduser_id, getuser_id
1                 2
2                 1
1                 3
user 테이블의 uid 를 참조 하고 있는 senduser_id, getuser_id 는 참조무결성을 지켜줘야하기때문에 1,2,3 행이 삭제됩니다.
 
post
pid,     content,               user_user_id
1,        '난 A 입니다.',       1
2,        '난 B 입니다',        2
3,        '난 C 입니다,         3
user 테이블의 uid를 참조 하고있는 user_user_id 는 참조무결성을 지켜줘야 하기때문에 1행이 삭제됩니다.
 
comment
cid, post_pid,  post_user_uid, text
1     1            2                     '안녕 A 댓글임'
2     2            1                     '안녕 B 댓글임'
post 테이블의 pid를 참조 하고 있는 post_pid는 참조 무결성을 지켜줘야 하기때문에 1행이 삭제됩니다.
post 테이블의 uid는 user 테이블의 uid를 참조 하고 있기때문에 참조 무결성을 지켜줘야 하기에 2행이 삭제 됩니다.
 
제가 설계한 테이블 관계는 위와 같습니다. 위 처럼 설계를 하면 식별관계에 문제점이 생긴다거나, 성능에 문제가 있을까요?
그리고 위처럼 설계를 하면 dml 작업에서 트랙잭션 시 잠금 범위가 확장되어 동시 처리에 영향
이 있을것같습니다. 그럼에도 불구 하고 위처럼 설계를 해야 한다면 그에 따른 대책은 어떤 것들이 있을까요?? 조언 부탁드립니다. 
milosz / 2012/07/31 14:18:33 / 추천 0
 그럼 만약에 하나에 게시글에 여러개의 아이디 즉 여러 유저에게 보내는 경우는 없는건가요?
dataguru / 2012/07/31 15:47:22 / 추천 0
pid,     content,                                        user_user_id
1,        '난 A 입니다.',                              1
2,        '난 B 입니다',                               2
3,        '난 C 입니다,                                3
4,        '난 A 입니다 2번째 글입니다.',       1
5,        '난 A 입니다 3번째 글입니다.',       1
6,        '난 B 입니다 2번째 글닙니다.',       2
cid, post_pid,  post_user_uid, text
1     1            2                     '안녕 A 댓글임'
2     2            1                     '안녕 B 댓글임'
3     1            2                     '안녕 A 댓글임 2번째'
4     1            2                     '안녕 A 댓글임 3번째'
5     2            2                     '안녕 A 댓글임 2번째'

milosz님 께서 하나의 게시글에 여러명의 유저 에게 보내는 경우라고 말씀 하셧는데 위의 erd 관계를 보시면 아시겟지만 post 의 자식이 user 가아니라 user 의 자식이 post입니다. 그러므로 1명의 user가 여러개의 글을 달수 있고 comment 의 부모가 post 이기 때문에 1개의 post에 여러개의 comment 를 달수가 있습니다. 
milosz / 2012/07/31 15:54:14 / 추천 0
 아 죄송합니다. 제가 글을 꼼꼼하게 읽고 달질 않았군요. 위에서 문제는 크게 없어 보입니다.
dataguru / 2012/08/01 17:39:16 / 추천 0
답변 달아주신분들 감사합니다.