2012-12-24 64 views
1

這是一個表格,可以被任何需要使用它的表格使用。因此,想象大量的使用。MySql - 具有外鍵約束的CREATE TABLE`SortOrder`?

delimiter $$ 

CREATE TABLE `sortorder` (
    `sortOrderId` int(11) NOT NULL AUTO_INCREMENT, 
    `sortOrder` tinyint(4) NOT NULL, 
    PRIMARY KEY (`sortOrderId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

需要什麼來確保此表可以處理任何LOAD被拋出的情況?

我只能想象需要爲sortOrder例如tinyint datatype,如果我有一個菜單的10個標籤,或5個縮略圖等,然後就可以看到我們就不需要大的INT數據類型在這裏。

我需要學習和做的另一件事是在該表上設置一個外鍵約束。

如果例如image表刪除sortOrderId的記錄,則需要在sortorder表中刪除匹配記錄。

這是如何完成的?

ALTER TABLE排序順序的代碼:

ALTER TABLE sortorder ADD FOREIGN KEY fk_sortorder; 

CREATE TABLE排序順序的代碼:

... 

**編輯:使用sortOrderIdimage表。 我必須確保如果在image表中刪除了一條記錄 - 相應的記錄將在sortorder表中刪除。

delimiter $$ 

CREATE TABLE `image` (
    `imageId` int(11) NOT NULL AUTO_INCREMENT, 
    `imageFileName` varchar(45) DEFAULT NULL, 
    `imagePath` varchar(255) DEFAULT NULL, 
    `imageTitle` varchar(100) DEFAULT NULL, 
    `imageAlt` varchar(100) DEFAULT NULL, 
    `imageWidth` int(11) DEFAULT NULL, 
    `imageHeight` int(11) DEFAULT NULL, 
    `classId` int(11) DEFAULT NULL, 
    `imageSizeId` tinyint(4) NOT NULL, 
    `isImageEnabled` bit(1) DEFAULT b'0', 
    `sortOrderId` int(11) DEFAULT NULL, 
    PRIMARY KEY (`imageId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

回答

1

的關鍵是使該錶快上,你會選擇和排序,如果他們有高基數列使用indexes。如果你認爲這個密鑰會有高度的變化,你應該在sortOrder上添加密鑰。


要獲得cascade delete,你需要這樣的:

ALTER TABLE sortorder 
    add CONSTRAINT fk_sortOrderId 
    FOREIGN KEY (sortOrderId) 
    REFERENCES image(sortOrderId) 
    ON DELETE CASCADE 

我認爲在sortOrder的索引將不會是非常有效的。這是由於索引所組成的BTree數據結構的性質所致。如果你仔細想想,sortOrder的大部分值可能會很低,爲1-10。幾乎沒有差異,指數的收益下降。

看來你會更好的使用複合索引。

CREATE INDEX `sort_index` on `sortorder` (`sortOrderId`, `sortOrder`) 

您必須監控運行時的性能真正得到的這一個感覺就是獲得最大的數據庫的正確的方式,我只是猜測。

+0

是否有ALTER TABLE語法我應該用來創建和設置外鍵? – JoJo

+1

@jojo外鍵?我想你只是想要一個'index' http://dev.mysql.com/doc/refman/5.0/en/create-index.html如果它是一個外鍵你應該發佈你的其他表 –

+0

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name' - sortOrder是什麼類型的INDEX? – JoJo