2011-12-21 70 views
3

我有一個兩個表事件和預訂,它們通過event_id鏈接。 實施例:使用日期字段作爲表之間的參考是明智的嗎?

CREATE TABLE `bookings` (

    `booking_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `event_id` int(10) UNSIGNED NULL DEFAULT NULL, 
    `fullname` varchar(80) NOT NULL, 
    `phone` varchar(20) NULL DEFAULT NULL, 
    `note` text NULL, 
    `date_created` datetime NOT NULL, 
    `date_updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 

    PRIMARY KEY (`booking_id`), 
    FOREIGN KEY (`event_id`) REFERENCES `events` (`event_id`) ON DELETE SET NULL ON UPDATE CASCADE, 

    INDEX `event_id` USING BTREE (`event_id`), 
    INDEX `source_id` USING BTREE (`source_id`) 
) 
ENGINE=InnoDB 
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci 
ROW_FORMAT=COMPACT; 

    #events 
CREATE TABLE `events` (
    `event_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT , 
    `date` date NOT NULL , 
    `title` varchar(255) NULL DEFAULT NULL , 
    `description` text NULL, 

    PRIMARY KEY (`event_id`, `date`), 
    UNIQUE INDEX `date` USING BTREE (`date`) , 
    INDEX `event_id` USING BTREE (`event_id`) 
) 
ENGINE=InnoDB 
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci 
ROW_FORMAT=COMPACT; 

我想知道,我可以使用日期字段如表之間的參考,因爲它消耗1個字節比較少爲整數,這是更容易閱讀和與單表,而不是合併操作。 但我不確定它是如何影響索引和SQL查詢性能的。

回答

2

將純數據字段用作表格之間的鏈接不是一個好主意。一個date字段看起來是直觀的通用字段,所以另一名工程師最終會更新字段以實現合理的應用目的。如果它被用作錶鏈接,更新會破壞鏈接。

爲什麼不爲錶鏈接創建特定的字段?當然,每個記錄可能需要4或8字節,但是你看過存儲的成本嗎?它幾乎是免費的。另一方面,對領域的非直觀使用可能會在未來的錯誤,誤解,混亂和停機時間中花費相當大的代價。

2

我不會這樣做。當日期移動到事件時會發生什麼?如果你在同一天有兩個事件呢?

你已經有了一個你不知道會改變的生成的自然鍵(event_id),所以使用它更安全。

相關問題