2013-04-19 4 views
1

내 소셜 네트워킹 앱에 대한 알림 체계를 만들고 있습니다. 나는 서로 다른 종류의 알림을 두 그룹으로 분류합니다 : 친구 관련 및 이벤트 관련. 현재 데이터베이스 스키마는 다음과 같습니다.IF-ELSE를 사용하여 MySQL에서 조건부 결합 문

+---------------------+------------------------+------+-----+---------+----------------+ 
| Field    | Type     | Null | Key | Default | Extra   | 
+---------------------+------------------------+------+-----+---------+----------------+ 
| notification_id  | int(11)    | NO | PRI | NULL | auto_increment | 
| notification_type | enum('event','friend') | NO |  | NULL |    | 
| notification_date | datetime    | NO |  | NULL |    | 
| notification_viewed | bit(1)     | NO |  | NULL |    | 
| user_id    | int(11)    | NO | MUL | NULL |    | 
+---------------------+------------------------+------+-----+---------+----------------+ 

이제 이벤트 관련 알림과 친구 관련 알림의 두 가지 테이블이 있습니다. 다음은 이벤트 관련 알림 테이블에 대한 스키마입니다 :

+-------------------------+----------------------------------------------------+------+-----+---------+-------+ 
| Field     | Type            | Null | Key | Default | Extra | 
+-------------------------+----------------------------------------------------+------+-----+---------+-------+ 
| notification_id   | int(11)           | NO | PRI | NULL |  | 
| event_id    | int(11)           | NO | MUL | NULL |  | 
| event_notification_type | enum('added','kicked','new-message','info-edited') | NO |  | NULL |  | 
+-------------------------+----------------------------------------------------+------+-----+---------+-------+ 

그리고 다시 나는에 대한 kickedadded는 각 이후 new-message, 통지의 info-edited 유형, 그것을 재산의 다른 종류를 위해 필요한 각 (4 개 이상의 테이블을했습니다 예 : kicked에는 이유가 필요함).

는 지금, 나는 notification_type 그렇지 않으면 다른 event 경우는 event_notificationnotification에 참여하도록 조건부 SQL 쿼리를 작성합니다.

SELECT * FROM notification_table t WHERE t.seen = FALSE 및 t.user_id =? INNER JOIN event_notification ko ON (t.notification_type = '이벤트'AND en.notification_id = t.notification_id) INNER JOIN .....

더 많은 내부 조인이있을 것입니다. ? 나는 나의 쿼리가 매우 최적화되지 않았다고 생각한다. 도움을 줄 수 있다면 감사하겠다.

+0

결과를 어떻게 보이시겠습니까? 다른 모든 테이블과 조인을 제안하지만'notification_table'에서 열만 리턴합니다. –

+0

알림을 위해 하나의 표를 갖는 것이 더 쉬울 것입니다. 알림 중 하나에 이유가 필요하기 만해도 다른 유형도 해당 테이블을 사용할 수 없으며 그 이유 필드가 null이되지 않음을 의미하지는 않습니다. – Richard

답변

1

조인을 사용할 수 있습니다. 그러나 왼쪽 외부를 사용하여 쿼리를 작성하려는 것은 내부 조인보다는 조인

SELECT * 
FROM notification_table t 
WHERE t.seen = FALSE AND t.user_id = ? left JOIN 
     event_notification en 
     ON(t.notification_type='event' AND en.notification_id = t.notification_id) left JOIN ... 

조인의 확산에 대해 걱정하지 마십시오. 테이블에 적절한 인덱싱이 있으면 정상적으로 수행됩니다.

다른 알림 유형에 대해 하나의 테이블 만 갖도록 데이터 구조를 변경하는 것을 고려하십시오. 사용되지 않는 몇 개의 필드가 있으면 많은 오버 헤드가 발생하지 않습니다. 특히 조인이 너무 많아서 더 많은 테이블을 보유하는 추가 관리 오버 헤드를 고려할 때 특히 그렇습니다.

+0

감사합니다. 아주 좋은 대답. 어떤 종류의 데이터 구조를 제안 하시겠습니까? 적어도 두 개의 테이블 두 개 또는 한 개만 가져야합니까? – Shivam