2011-10-13 4 views
0

연락처가있는 테이블과 메시지가있는 테이블이 있습니다. 메시지 테이블에는 메시지가 전송 된 구성원 ID의 일련 화 된 문자열이있는 셀이 있습니다.구조화 mySQL

이제 고유 식별자 토큰을 추가 할 것이며 회원이 응답하면 어떤 회원인지를 추적 할 수 있습니다. 이 정보를 별도의 테이블에 저장하거나 응답 한 구성원 문자열을 보유 할 수있는 메시지 테이블에 다른 셀을 추가해야합니까?

Logic은 별도의 테이블이 더 쉬울 것이라고 말하지만 동시에 여러 수신자 그룹이있을 수 있기 때문에 매우 빠르게 성장할 수 있으며 각각의 메시지는 여러 행으로 변환 될 수 있습니다. 직렬화 된 문자열이있는 단일 셀과는 대조적입니다.

+1

내가 게시 한 질문 중 일부는 여전히 답변이 없습니다. 질문에 대답하지 않은 사람을 받아 들인다면 그것은 SO 모델을 평가 절하 할 것입니다. – santa

+0

충분합니다. 당신은 자신의 질문 중 70 % 만 대답하는 소수의 사람들입니다. :) – GolezTrol

답변

1

나는 기존의 접근 방식이 조인 테이블을 가질 것이라고 생각한다. 따라서 Contacts 테이블과 Messages 테이블이있는 경우 ContactsMessages이라는 기본 키가 모두 열로있는 메시지를 추적 할 수 있도록 ContactMessagesSent 테이블을 만들 수 있습니다. 응답을 추적하기 위해 다른 조인 테이블 ContactMessagesReceived을 생성 할 수 있습니다.

그래서

ContactMessagesSent 
-------- 
contact_id ; // primary key of Contacts 
message_id ; // primary key of Messages 
... 

당신이 적절한 인덱스를 사용하는 경우

, 그것은 테이블의 행을 많이가있는 경우에도 잘 수행합니다.

+0

적절한 색인 생성이란 무엇입니까? – santa

+0

은 테이블을 쿼리하는 방법에 따라 다릅니다. contact_id, message_id 및 둘 모두로 색인을 생성하려고합니다 (contact_id, message_id) – hvgotcodes

2

별표를 사용하면 더 쉽고 빠를 것입니다.

예를 들어, 특정 사용자에게 보낸 모든 메시지를 찾으려면 간단한 쿼리 (WHERE recipient = id)가 필요합니다. 이 쿼리는 인덱스를 사용할 수 있기 때문에 잘 수행됩니다.

쉼표로 구분 된 ID 목록으로 텍스트 필드에 저장하는 경우 예를 들어 FIND_IN_SET을 사용하여 쿼리를 작성해야합니다. 이 쿼리는 인덱스를 사용할 수 없습니다.

+0

각받는 사람에게 보낸 메시지를 찾는 기능이 필요하다고 생각하지 않습니다. 그러나 나는 그것이 전달 된 사람과 응답이 있었는지 아닌지를 표시 할 필요가있을 것입니다. 나는 분리 된 테이블을 향해 몸을 기울이기 시작했다. 무엇이 MySQL에서 합리적으로 큰 테이블로 간주됩니다. 간단한 디지트 ID로 4 열만 있다고 가정하면 몇 행을 사용할 수 있습니까? – santa

1

별도의 테이블을 만듭니다. 직렬화 된 멤버 문자열을 저장하는 것은 처음에는 잘못된 결정이었습니다. 그러한 필드에 대해 질의하는 것은 번거롭고 느립니다.

구성원을 메시지에 바인딩하는 별도의 상호 링크 테이블을 만들어 실제로 쿼리 할 수 ​​있습니다. 그런 다음 해당 테이블에 '응답 됨'필드를 추가하여 회원이 응답 한 경우 표시 할 수 있습니다.