2

이벤트를 반복 할 응용 프로그램이 있습니다. 그래서 이벤트는 하루에 "매 n 일마다", 매주 "월요일/화요일/수요일마다 n 주", 그리고 "1 개월, 2 개월, 3 일 등의 n 개월마다"반복 될 수 있습니다.MySQL 아키텍처 : null 열 대 조인

테이블 디자인 관점에서 이것을 처리하는 가장 좋은 방법은 무엇입니까? 나는 두 가지 방법을 생각할 수 있지만 어느 것이 더 낫지는 모르겠습니다.

1) 위의 경우 5 개, 주간 및 월간 각각 2 개입니다. 사용되지 않는 것이면 null이됩니다. 내 응용 프로그램에서 nulls 볼 수 있으며 무시할 수 있습니다.

2) events_dateinfo 또는 something과 같은 두 번째 테이블에 대해 쿼리에 대해 조인을 수행하십시오.

옵션 2는 아마도 '정상화'된 것일 수도 있고 그렇지 않을 수도 있지만, 그런 단순한 일로 과장된 행동으로 보입니까? 또한 옵션 2로 이동하려면 행을 열로 변환하는 방법이 있습니까? 즉, 특정 이벤트의 2 주 속성을 선택하고 열로 처리하도록 할 수 있습니까?

답변

1

오른쪽 이벤트가 두 개 이상의 일정을 가질 수 있음을 알고있는 경우 (이 이유 때문에 "행을 열로 변환"해야합니다).

이 경우 2 개가 아니고 3 개의 테이블이 필요하지 않습니다. 세 번째는 교차점 테이블이어야합니다. 나중에이 계획을 사용하여 새로운 일정을 쉽게 추가 할 수 있습니다. 그래서,이 같은 :

table events (event_id, event_name, description) 
table schedules (sch_id, schedule) 
table event_schedule (event_id, sch_id) 

이 내가 아는 한 MySQL은 PIVOT 가능성이 아니지만, 당신이 GROUP_CONCAT() SELECT의 기능을 사용할 수 있습니다; 이벤트 당 하나의 행이되고 하나의 이벤트에 대한 모든 스케줄은 하나의 컬럼에 있습니다.

SELECT e.event_name AS Event, GROUP_CONCAT(s.schedule SEPARATOR ', ') AS Schedule 
     FROM events e 
    (LEFT) JOIN event_schedule es 
    ON e.event_id = es.event_id 
    JOIN schedules s 
    ON s.sch_id = es. sch_id 
     GROUP BY e.event_name; 
0

나는 하나의 테이블에있는이 표준화 된 이벤트와 다른 이벤트의 재발행성을 처리하는 것을 선호한다.

인덱스를 적절하게 처리하면 뷰를 통해 데이터 요청을 처리하거나 데이터가 커지면 트리거가있는 감사 테이블을 처리 할 수 ​​있습니다.