我正在建立一个销售房屋的数据库。
我正在调用一个父表 location
有三列:
locationlat:物业所在的纬度
locationlong:属性的经度
locationname:我可以使用的另一个名称,通过名称来标识属性的位置
两者 locationLat
以及 locationlong
组成此表的复合主键。
然后我有一个叫做 houseToLet
,此表仅存储出租房屋。我有相似的不同的table houseToBuy
, fullyFurnished
, landtoSell
等等,这张table houseTolet
具有类似于上面位置表的复合主键,即 locationLat
, locationLong
和一个外键 location_locationLat
以及 location_locationLong
引用位置表的。
我还有一张table叫 generalFeatures
. 这张表是我存储所有我正在出售的房产的一般特征的地方。所以呢 generalFeatures table
是的子表 houseTolet
以及 Housetobuy
以及 Fullyfurnished
table,
当我将行插入 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
没有外键约束的房屋出租表,我需要更新其他表,如 houseTobuy
或者 fullyFurnished
首先,这是因为在一个特定的情况下,我只会更新一个特定类型的房子,但没有太多的选择。在我的情况下,要出租的房子不能同时是要买的房子。
1条答案
按热度按时间chhkpiq41#
你的数据库设计有缺陷。也就是说,您正在多个表中存储可以表示为单个记录的信息。实际上,看起来所有表都可以合并到主表中
locations
:这个
house*
表(houseToLet
,houseToBuy
,…)仅用于存储位置的当前状态(出租、购买……):这可以表示为ENUM
中的字段location
表(如果一次可以启用多个状态,则作为多个布尔列)这个
generalFeatures
表似乎还包含每个位置的单个记录,因此它的所有字段都可以移动到location
table。使用一个表似乎是适合您的用例的正确设计(而且它确实避免了外部约束的问题……)。
其他注意事项:使用自动递增的整数作为主键,而不是复合键(为此,可以创建
UNIQUE
约束)。以下是表格的ddl示例: