我有三個表:Mysql架構連接表兩個可選的約束上
地址
CREATE TABLE IF NOT EXISTS `main`.`address` (
`id` BIGINT NOT NULL AUTO_INCREMENT ,
`street_number` VARCHAR(5) NOT NULL ,
`street_name` VARCHAR(255) NOT NULL ,
`town_village` VARCHAR(50) NOT NULL ,
`county` VARCHAR(50) NOT NULL ,
`country` VARCHAR(45) NOT NULL ,
`postcode` VARCHAR(10) NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `street_number_UNIQUE` (`street_number` ASC, `street_name` ASC, `town_village` ASC, `county` ASC, `country` ASC, `postcode` ASC))
ENGINE = InnoDB
**Geolocation**
CREATE TABLE IF NOT EXISTS `warrington_main`.`address` (
`id` BIGINT NOT NULL AUTO_INCREMENT ,
`street_number` VARCHAR(5) NOT NULL ,
`street_name` VARCHAR(255) NOT NULL ,
`town_village` VARCHAR(50) NOT NULL ,
`county` VARCHAR(50) NOT NULL ,
`country` VARCHAR(45) NOT NULL ,
`postcode` VARCHAR(10) NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `street_number_UNIQUE` (`street_number` ASC, `street_name` ASC, `town_village` ASC, `county` ASC, `country` ASC, `postcode` ASC))
ENGINE = InnoDB
**Image**
CREATE TABLE IF NOT EXISTS `warrington_main`.`image` (
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT ,
`alias_title` VARCHAR(255) NOT NULL ,
`title` VARCHAR(100) NOT NULL ,
`description` VARCHAR(2000) NOT NULL ,
`main_image` VARCHAR(50) NOT NULL ,
`thumbnail_image` VARCHAR(50) NOT NULL ,
`thumbnail_image_medium` VARCHAR(50) NOT NULL ,
`thumbnail_image_small` VARCHAR(50) NOT NULL ,
`thumbnail_image_gallery` VARCHAR(50) NOT NULL ,
`hits` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0' ,
`show_comment` ENUM('0','1') NOT NULL ,
`section` TINYINT(2) UNSIGNED NOT NULL ,
`flickr_youtube_id` VARCHAR(20) NOT NULL ,
`feature_in_gallery` ENUM('0','1') NOT NULL ,
`created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`date_taken` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`updated_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
`updated_by` MEDIUMINT(8) UNSIGNED NOT NULL ,
`approved` ENUM('Inprocess','Yes','No') NOT NULL DEFAULT 'Inprocess' ,
`visible` ENUM('0','1') NOT NULL DEFAULT '0' ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `alias_title` (`alias_title` ASC) ,
UNIQUE INDEX `flickr_youtube_id` (`flickr_youtube_id` ASC) ,
INDEX `title` (`title` ASC) ,
INDEX `approved` (`approved` ASC) ,
INDEX `visible` (`visible` ASC) ,
INDEX `feature_in_gallery` (`feature_in_gallery` ASC))
ENGINE = InnoDB
AUTO_INCREMENT = 23162
DEFAULT CHARACTER SET = utf8
現在每個圖像可以有一個地理位置和地址。我打算創建另一個名爲location的表。
我正要爲地理位置和地址創建具有可選關係的位置。換句話說,一個位置可能是地理位置或地址,或者兩者兼而有之。我不想存儲null/null。第一個問題是我將如何創建一個表中有兩個可選的關係在這種情況下,並確保我不會null/null。
然後我需要將位置表關聯到圖像表。我可能希望將來針對另一個表的位置或地址/或地理編碼進行查詢,即事件。
所以事件的位置可能與圖像表中存儲的位置相同。有人知道這是否是最好的結構。圖像表格/地址/地理位置,然後是圖像表格。
換句話說,我有一個表格,它包含兩個可選的地理位置和地址關係。我會需要任何一個包括在表中,但不是兩個都是空的。我如何執行這個約束
我想,以選擇第二個選項爲我在其他表在未來的搜索。即一個事件的位置可能與圖像相同。然後,我可以使用相同的位置/地址或地理編碼查找事件和圖像。如果我在圖像中創建了一個關於地理編碼的關係,並且解決了這個問題,將很難看出哪個事件具有相同的地理編碼和地址。我確實需要確保參照完整性,但是一個位置可以有可選地址或可選地理位置。我們可以有一個位置或地址的座標。 –
在這種情況下是最好能有參考intergrity與將指定位置的類型另一個領域。或增加一個檢查與觸發器 –
@MatthewChambers那麼它聽起來就像你已經回答了你自己的問題與問候模式。有一個單獨的位置表在你的情況下是有道理的。參照完整性的問題在於,它會迫使你爲每個地址和地理位置外鍵字段賦值。所以,你的情況,你想允許有字段或兩個字段不能夠被執行,因爲你希望能夠有在這些領域NULL值。 –