2012-04-19 73 views
0

假設這是表的SQL代碼:MySQL:我應該在這個表中創建什麼樣的索引?

CREATE TABLE `user_is_in` (
    `id_user` INT NULL , 
    `id_city` INT NULL , 
    `when` DATETIME NULL , 
    INDEX `fk_user` (`id_user` ASC) , 
    INDEX `fk_city` (`id_city` ASC) , 
    CONSTRAINT `fk_user` 
    FOREIGN KEY (`id_user`) 
    REFERENCES `user` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `fk_city` 
    FOREIGN KEY (`id_city`) 
    REFERENCES `city` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 

使用該表是存儲的一種Foursquare的簽到(A用戶在同一時間註冊在一個地方)。

現在我有兩個選擇:

  • 創建具有3個字段,並沒有主鍵的唯一索引:

    UNIQUE INDEX id_user_is_in_UNIQUEid_user ASC,id_city ASC,when ASC)

  • 創建一個額外的經典id自動增量字段

,因爲我想創建了用戶和城市查詢(即:搜索誰做了一個簽入的所有用戶在一個城市的一個日期)

感謝事先我不喜歡第二個選項。

+0

如果此表將用作任何其他表中的外鍵,那麼最好使用auto_increment int字段。否則,你將不得不在每個外表中拖動用戶/城市/字段,這會非常迅速地變得非常痛苦。 – 2012-04-19 14:14:39

+0

你希望我們做什麼 – 2012-04-19 14:15:08

+0

對不起,我只是想索引建立哪種類型的建議。而Marc,這個表有2個fk,但沒有其他表有外鍵。 – jorgeas80 2012-04-19 18:07:34

回答

0

你應該這樣做。添加一個自動遞增主鍵併爲所有三列添加唯一性約束。使用單獨的系統分配的鍵,您可以更容易地定義外鍵到這個新表,如果最終需要的話。並且對所有三列具有唯一性約束將確保重複數據不會被創建。

一些快速旁註:

  • 因爲這是一個關聯表,你列真應 NOT NULL
  • 您可能希望將一個城市的CASCADE刪除刪除至 關聯表。
+0

好吧,我認爲你是對的。只有一點變化:我更喜歡'關於刪除限制',以防止意外刪除。非常感謝! – jorgeas80 2012-04-19 18:05:21

+0

是的,關於刪除限制也是一個很好的選擇。祝好運與其他節目! – Perception 2012-04-19 18:08:07

相關問題