我有两个表事件和预订,由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查询性能。
答案 0 :(得分:2)
使用纯数据字段作为表之间的链接并不是一个好主意。 date
字段似乎是直观的通用字段,因此另一位工程师最终会更新该字段以用于合理的应用目的。如果它被用作表链接,更新将破坏链接。
为什么不为表链接创建特定字段?当然,每条记录可能需要4或8个字节,但您是否考虑过存储成本?它几乎是免费的。另一方面,在未来的错误,误解,混淆和停机时间内,非直观地使用字段可能会花费相当多的钱。
答案 1 :(得分:2)
我不会这样做。日期移动时会发生什么?如果你在同一天有两个活动怎么办?
您已经拥有一个您知道不会更改的生成自然键(event_id),因此使用它更加安全。