2

这里的第一个问题:

目前我正在开发一个需要使用 3 个不同实体的项目。这些实体是:用户、场地和设施。

每个实体都有它的表:

设施表:

CREATE TABLE `facility` (
`facility_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`venue_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
`surface` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
`max_timeblock` INT(10) UNSIGNED NOT NULL,
`min_timeblock` INT(10) UNSIGNED NOT NULL,
`availability` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`facility_id`),
UNIQUE INDEX `facility_id` (`facility_id`),
INDEX `facility-venue_id_key` (`venue_id`),
CONSTRAINT `facility-venue_id_key` FOREIGN KEY (`venue_id`) REFERENCES `venue` (`venue_id`) ON UPDATE CASCADE ON DELETE CASCADE)

场地表:

CREATE TABLE `venue` (
    `venue_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `description` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `email` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `phone` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `opening_time` TIME NOT NULL,
    `closing_time` TIME NOT NULL,
    `booking_conditions` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `booking_method` INT(10) UNSIGNED NOT NULL,
    `status` INT(10) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`venue_id`),
    UNIQUE INDEX `venue_id` (`venue_id`)
)

用户表:

CREATE TABLE `user` (
    `user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'This field will hold the Unique ID for each user.',
    `username` VARCHAR(50) NOT NULL COMMENT 'This field will be classed as a display name for the users so when searching they arent looking for the ID.' COLLATE 'utf8_unicode_ci',
    `email` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `password` VARCHAR(128) NOT NULL COLLATE 'utf8_unicode_ci',
    `first_name` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `last_name` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `facebook_id` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `user_type_id` INT(10) NULL DEFAULT NULL,
    `postcode` INT(10) NULL DEFAULT NULL,
    `status` INT(10) NULL DEFAULT NULL,
    `date_created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
    `date_modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`user_id`),
    UNIQUE INDEX `username` (`username`),
    UNIQUE INDEX `email` (`email`),
    UNIQUE INDEX `user_id` (`user_id`)
)

因此,我试图实现一个媒体表。

该表的一个示例如下:

CREATE TABLE `media` (
    `media_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `album_id` INT(10) UNSIGNED NULL DEFAULT '0',
    `alt_name` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
    `mine_type` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
    `url_link` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',
    PRIMARY KEY (`media_id`),
    INDEX `media-album_id_key` (`album_id`),
    CONSTRAINT `media-album_id_key` FOREIGN KEY (`album_id`) REFERENCES `album` (`album_id`) ON UPDATE CASCADE ON DELETE CASCADE
)

我想要的是允许用户、设施有 1 张与之关联的图像和场地有与之关联的相册。

因此,我不确定如何在这方面实现外键,因为如果我将一列媒体放入用户表中,并在删除媒体时将外键设置为 Media_ID,它会删除用户,因为级联影响会这样做。

我想要的是,如果我删除用户/设施/场地,它将删除与之关联的所有图像。

任何援助将不胜感激。

问候,

罗伯特

4

1 回答 1

0

如果不使用触发器,你不能直接做你想做的事情,所以我在这里将它列为你的第一个选项,以及你真正应该避免的第二个选项,但会给你一个关于如何进一步调查这个模式问题的线索.

  • 将每个设施/场所/用户的外键保留到media表中,但使用一个ON DELETE SET NULL而不是ON DELETE CASCADE引用操作,然后在您的应用程序代码(或触发器中)实现相关媒体的删除
  • 查找“多态关联”以及为什么它们在关系数据库中是一个坏主意,如果您仍然确信自己想要这样做,请使用一种可用的技术来构建您正在考虑的倒置关系。
于 2013-09-06T11:39:18.773 回答