2014-09-03 45 views
0

我在我的數據庫中有一個消息表。問題是我爲每個收件人的每封郵件都有一行,即使他們收到了相同的郵件。見下:MySQL數據庫優化 - 我有一個消息表,有很多重複的信息

| ID | RECIP_ID | MESSAGE    | 
| 1 | 366  | "URGENT REMINDER..." | 
| 2 | 367  | "URGENT REMINDER..." | 
| 3 | 368  | "URGENT REMINDER..." | 

所以,你可以(希望)看到,這是相同的消息保存每個收件人。我相信這是非常低效的。什麼是最好的方法來做到這一點?我想記錄每個recip_id已發送的消息。

回答

1

簡而言之,我會建議您的表格爲to normalize。來存儲數據有效,它需要你使用至少3個表:

  • 消息(ID,內容,時間戳) - 存儲消息
  • 收件人(ID,等等。 。) - 存儲收件人
  • RecipientMessages(的MessageId,RecipientId) - 來存儲哪個消息尋址到該接收方

選擇例如,當您格式化上面這將讓數據:

SELECT 
    `r`.*, 
    `m`.* 
FROM 
    `Messages` as `m` 
     INNER JOIN `RecipientMessages` as `rm` 
      ON `m`.`Id` = `rm`.`MessageId` 
     INNER JOIN `Recipients` as `r` 
      ON `rm`.`RecipientId` = `r`.`Id` 

插入例如,它會給你的想法如何寫數據:

START TRANSACTION; 

INSERT INTO `Messages` 
    (`Id`, `Content`, `TimeStamp`) 
VALUES 
    (NULL, 'URGENT REMINDER...', NOW()); 

INSERT INTO `RecipientMessages` 
    (`MessageId`, `RecipientId`) 
VALUES 
    (LAST_INSERT_ID(), 366), 
    (LAST_INSERT_ID(), 367), 
    (LAST_INSERT_ID(), 368); 

COMMIT; 
相關問題