Разумно ли использовать поле даты в качестве ссылки между таблицами? - PullRequest
3 голосов
/ 21 декабря 2011

У меня есть две таблицы событий и бронирований, которые связаны 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 ]

2 голосов
/ 21 декабря 2011

Я бы этого не делал.Что происходит, когда дата перемещается для события?Что если у вас два события в один и тот же день?

У вас уже есть сгенерированный натуральный ключ, который, как вы знаете, не изменится (event_id), поэтому его безопаснее использовать.

2 голосов
/ 21 декабря 2011

Не рекомендуется использовать чистое поле данных в качестве связи между таблицами. Поле date выглядит как поле общего назначения интуитивно, поэтому другой инженер в конечном итоге обновит поле для разумных прикладных целей. Если бы он использовался в качестве ссылки на таблицу, обновления повредили бы связь.

Почему бы не создать специальное поле для связи таблиц? Конечно, это может стоить 4 или 8 байт на запись, но вы смотрели на стоимость хранения? Это почти бесплатно. С другой стороны, неинтуитивное использование поля может стоить немало в будущем ошибок, недоразумений, путаницы и простоев.

...