Mysql 使用日期字段作为表之间的引用是否明智?

Mysql 使用日期字段作为表之间的引用是否明智?,mysql,database-design,query-optimization,Mysql,Database Design,Query Optimization,我有两个表events和bookings,它们由event\u id链接。 例如: 我想知道,我是否可以使用date字段作为表之间的引用,因为它比integer少消耗1个字节,而且使用单个表而不是组合表更容易读取和操作。 但是我不确定它是如何影响索引和SQL查询性能的。使用纯数据字段作为表之间的链接不是一个好主意。从直觉上看,date字段似乎是一个通用字段,因此另一位工程师最终会出于合理的应用目的更新该字段。如果将其用作表链接,则更新会中断链接 为什么不创建一个用于表链接的特定字段呢?当然,每个

我有两个表events和bookings,它们由event\u id链接。 例如:

我想知道,我是否可以使用date字段作为表之间的引用,因为它比integer少消耗1个字节,而且使用单个表而不是组合表更容易读取和操作。
但是我不确定它是如何影响索引和SQL查询性能的。

使用纯数据字段作为表之间的链接不是一个好主意。从直觉上看,
date
字段似乎是一个通用字段,因此另一位工程师最终会出于合理的应用目的更新该字段。如果将其用作表链接,则更新会中断链接


为什么不创建一个用于表链接的特定字段呢?当然,每个记录可能需要4或8个字节,但您是否考虑过存储成本?它几乎是免费的。另一方面,非直观地使用字段可能会在未来的错误、误解、混乱和停机时间中付出相当大的代价。

我不会这么做。当事件的日期移动时会发生什么?如果你在同一天有两个活动呢

您已经有了一个生成的自然密钥,您知道它不会更改(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;