2009-12-20 3 views
0

큰 (또는 작은) 그룹의 전자 메일이 cron 작업 (루프가 아니라 사용자가 보내기를 기다리는 동안)에 의해 배달되도록 예약 된 시스템을 구현하려고합니다.데이터베이스 구조 질문 ... 배달 예정 이메일?

사용자가 보낼 수있는 전자 메일 유형은 구독자 테이블의 모든 사용자에게 전자 메일을 보내거나 그룹 구성원에게만 전자 메일을 보낼 수 있습니다. 나는 그룹 회원들에게 이메일을 포함시킬 필요가 없다고 생각한다. 왜냐하면 그들은 작은 그룹들에 이메일이 될 것이고 큰 (모든 가입자들) 그룹들에게는 이메일이 될 것이기 때문이다.

필자는 데이터베이스를 구성하는 방법을 이해하려고 노력하고 있지만 작동 방법을 설명하는 데 어려움을 겪고 있습니다.

당신이 공유 할 수있는 이런 종류의 경험이 있습니까? 전달 대기중인 이메일을 추적하기 위해 데이터베이스를 어떻게 구성해야합니까?

+0

제목은 "일정 관리"이지만 제목은 "지원"입니다. 1 명 이상의 수신자. 전자 메일 서버는 전자 메일을 대기시킬 수 있으며 지정된 간격으로 만 보낼 수 있습니다. –

답변

0

보류중인 전자 메일을 사용자에게 연결하려면 조인 테이블을 사용하십시오. 다른 조인 테이블을 사용하여 그룹을 관리하십시오. 전자 메일이 그룹을 대상으로하는 경우 저장 프로 시저를 사용하여 EmailRecipients 테이블에 그룹의 모든 구성원 ID를 채울 수 있습니다.

테이블 :

PendingEmails 
    ID 
    Subject 
    Body 

EmailRecipients (join table) 
    EmailID 
    UserID 

Users 
    ID 

Groups (join table) 
    GroupID 
    UserID 
3

당신이 구현하고자하는 스토리지 계층을 이용하여 기본 큐입니다.

User (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    email VARCHAR(125) NOT NULL 
); 

User_Group (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    user_id INTEGER UNSIGNED NOT NULL, 
    group_id INTEGER UNSIGNED NOT NULL 
); 

Group (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(75) NOT NULL, 
    description VARCHAR(255) 
) 

MailingList (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    user_id INTEGER UNSIGNED NOT NULL, 

); 

# mails to be sent out to groups/all 
MailQueue (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    group_id INTEGER UNSIGNED, 
    time_to_send DATETIME DEFAULT CURRENT_TIMESTAMP 
); 

당신은 그룹 이메일이 유효한 유닉스 타임 스탬프로 MailQueue의 항목을 입력 할 수 대기열 것이다. 테이블을 적절하게 활용할 수 있도록 각 사용자마다 할당 할 그룹 '모두'를 만들어야합니다. 당신은 너무처럼 크론 쿼리를 실행합니다 : 중복 이메일 항목을 보내지 않도록하는 것처럼 당신이 그들을 사용 후

SELECT User.email 
FROM MailQueue 
INNER JOIN User_Group ON (MailQueue.group_id = User_Group.id) 
INNER JOIN User ON (User_Group.user_id = User.id) 
WHERE MailQueue.time_to_send < NOW(); 

당신은 당신이 결과 집합을 삭제 확인해야합니다. 보낸 이메일의 기록을 남기고 싶다면 sent_email = 1을 나타내는 다른 TINYINT(1) UNSIGNED 필드를 추가하고 값이 0이면 결과를 수집하도록 SELECT 쿼리를 수정하십시오.