簡體   English   中英

我有一個子表,它依賴於兩個不相關的父表。 我想在子表中插入行

[英]I have a child table that depends on two parent tables that are not related. i want to insert rows into child table

我正在創建一個用於銷售房屋的數據庫。

我有一個父表,我稱之為location ,它包含三列:

  • locationLat : 財產位置的緯度
  • locationLong : 屬性的經度
  • locationName : 一個替代名稱,我可以用它來按名稱標識屬性的位置

locationLatlocationlong都構成了該表的復合主鍵。

然后我有一個叫做houseToLet的子表,這個表只存儲出租的房子。 我有類似的不同的表houseToBuyfullyFurnishedlandtoSell等。用於表houseTolet具有類似位置表格上方即復合主鍵locationLatlocationLong和外國復合鍵location_locationLatlocation_locationLong引用位置表。

然后我有另一個名為generalFeatures表。 這是我存儲我銷售的所有房產的一般特征的表格。 所以generalFeatures tablehouseToletHousetobuy的子表以及Fullyfurnished表,

當我將行插入location表時,我發現沒有問題,因為它是父表。 當我將行插入houseTolet表時,我發現沒有問題,因為它是一個子表,我已經插入了父位置表。 但是,當我插入generalFeatures表時,我遇到了問題,因為它是housetoBuy的子表以及其他表,包括Fullyfurnished

請幫助我知道如何做到這一點。

  CREATE TABLE IF NOT EXISTS `foreign`.`location` (
  `locationLat` DECIMAL(10,8) NOT NULL,
  `locationLong` DECIMAL(11,8) NOT NULL,
  `locationName` VARCHAR(35) NOT NULL,
  PRIMARY KEY (`locationLat`, `locationLong`))
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `location`.`housetolet` (
  `locationLat` DECIMAL(10,8) NOT NULL,
  `locationLong` DECIMAL(11,8) NOT NULL,
  `type` ENUM('gatedCommunity', 'standalone', 'apartment') NOT NULL,
  `location_locationLat` DECIMAL(10,8) NOT NULL,
  `location_locationLong` DECIMAL(11,8) NOT NULL,
  PRIMARY KEY (`locationLat`, `locationLong`),
  INDEX `fk_housetolet_location_idx` (`location_locationLat` ASC, `location_locationLong` ASC))


CREATE TABLE IF NOT EXISTS `foreign`.`generalfeatures` (
  `locationLat` DECIMAL(10,8) NOT NULL,
  `locationLong` DECIMAL(11,8) NOT NULL,
  `livingAreaAndSize` INT NOT NULL,
  `bedrooms` TINYINT(4) NOT NULL,
  `bathrooms` TINYINT(4) NOT NULL,
  `masterEnsuite` TINYINT(1) NOT NULL,
  `bedroomsWithBathrooms` TINYINT(4) NOT NULL,
  `kitchenAndSize` TINYINT(4) NOT NULL,
  `parkingAndSlots` TINYINT(4) NOT NULL,
  `swimmingPool` TINYINT(1) NOT NULL,
  `liftsAndNumber` TINYINT(4) NOT NULL,
  `CCTV` TINYINT(1) NOT NULL,
  `sizeOfLand` INT(11) NOT NULL,
  `borehole` TINYINT(1) NOT NULL,
  `housetobuy_locationLat` DECIMAL(10,8) NOT NULL,
  `housetobuy_locationLong` DECIMAL(11,8) NOT NULL,
  `housetolet_locationLat` DECIMAL(10,8) NOT NULL,
  `housetolet_locationLong` DECIMAL(11,8) NOT NULL,
  `fullyfurnished_locationLat` DECIMAL(10,8) NOT NULL,
  `fullyfurnished_locationLong` DECIMAL(11,8) NOT NULL,
  PRIMARY KEY (`locationLat`, `locationLong`),
  INDEX `fk_generalfeatures_housetobuy1_idx` (`housetobuy_locationLat` ASC, `housetobuy_locationLong` ASC),
  INDEX `fk_generalfeatures_housetolet1_idx` (`housetolet_locationLat` ASC, `housetolet_locationLong` ASC),
  INDEX `fk_generalfeatures_fullyfurnished1_idx` (`fullyfurnished_locationLat` ASC, `fullyfurnished_locationLong` ASC),
  CONSTRAINT `fk_generalfeatures_housetobuy1`
    FOREIGN KEY (`housetobuy_locationLat` , `housetobuy_locationLong`)
    REFERENCES `foreign`.`housetobuy` (`locationLat` , `locationLong`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_generalfeatures_housetolet1`
    FOREIGN KEY (`housetolet_locationLat` , `housetolet_locationLong`)
    REFERENCES `foreign`.`housetolet` (`locationLat` , `locationLong`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_generalfeatures_fullyfurnished1`
    FOREIGN KEY (`fullyfurnished_locationLat` , `fullyfurnished_locationLong`)
    REFERENCES `foreign`.`fullyfurnished` (`locationLat` , `locationLong`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

我希望能夠將行插入到generalFeatures表中以供出租,而無需獲得外鍵約束,我需要先更新其他表,例如houseTobuyfullyFurnished ,這是因為在特定情況下,我將更新特定類型的房屋只有但沒有很多選擇。 在我的情況下,出租的房子不能同時是購買的房子。

您的數據庫設計存在缺陷。 也就是說,您將可以表示為單個記錄的信息存儲在多個表中。 實際上,看起來所有表都可以合並到主表locations

  • house*表( houseToLethouseToBuy ,...)只是為了存儲位置的當前狀態(出租,購買,...):這可以表示為location表中的ENUM字段(或如果一次可以啟用多個狀態,則作為多個布爾列)

  • generalFeatures表似乎也包含每個位置的單個記錄,因此其所有字段都可以移動到location表中。

使用單個表似乎是您用例的正確設計(它確實避免了外部約束的問題......)。

其他注意事項:使用自動遞增的整數作為主鍵而不是復合鍵(為此,您可以創建一個UNIQUE約束)。

這是您的表的示例 DDL:

CREATE TABLE IF NOT EXISTS `foreign`.`location` (

    -- primary key
    `id` INT AUTO_INCREMENT,
    PRIMARY KEY (`id`),

    -- original columns
    `locationLat` DECIMAL(10,8) NOT NULL,
    `locationLong` DECIMAL(11,8) NOT NULL,
    `locationName` VARCHAR(35) NOT NULL,

    -- house status
    `status` ENUM('toLet', 'houseToBuy', 'fullyFurnished', 'landtoSell') NOT NULL,

    -- columns from `generalfeatures`
    `livingAreaAndSize` INT NOT NULL,
    `bedrooms` TINYINT(4) NOT NULL,
    `bathrooms` TINYINT(4) NOT NULL,
    `masterEnsuite` TINYINT(1) NOT NULL,
    `bedroomsWithBathrooms` TINYINT(4) NOT NULL
    -- other columns from `generalfeatures`...
)ENGINE = INNODB;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM