我有三张桌子:
property
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` MEDIUMINT(8) UNSIGNED NOT NULL,
`title` VARCHAR(100) NOT NULL,
`alias_title` VARCHAR(255) NOT NULL,
`primary_category` TINYINT(3) UNSIGNED NOT NULL,
`second_category` TINYINT(3) UNSIGNED NOT NULL,
`reference_number` VARCHAR(100) NOT NULL,
`description` VARCHAR(10000) NOT NULL,
`no_of_bedrooms` TINYINT(2) UNSIGNED NOT NULL,
`no_of_bathrooms` TINYINT(2) UNSIGNED NOT NULL
property Rental
`property_id` MEDIUMINT(8) UNSIGNED NOT NULL,
`minimum_rental_months` TINYINT(2) UNSIGNED NOT NULL,
`minimum_rental_years` TINYINT(2) UNSIGNED NOT NULL,
`maximum_rental_months` TINYINT(2) UNSIGNED NOT NULL,
`maximum_rental_years` TINYINT(2) UNSIGNED NOT NULL,
`available_from` DATE NOT NULL,
`available_to` DATE NOT NULL,
`type_of_letting` TINYINT(1) UNSIGNED NOT NULL,
`price` DECIMAL(7,2) UNSIGNED NOT NULL,
`deposit` DECIMAL(7,2) UNSIGNED NOT NULL,
`additionals_included_with_rent` VARCHAR(500) NOT NULL
property Sales
`property_id` MEDIUMINT(8) UNSIGNED NOT NULL,
`price` DECIMAL(10,2) UNSIGNED NOT NULL
情况是房产可以是出租房产或出售房产。它需要是另一个。 property_id是销售和租赁中的外国财产。但是,使用此结构,用户实际上可以创建不属于租赁或销售的属性。我需要设置一些约束,因此属性必须在销售或租赁表中。
然后我需要查询以查找所有属性和相关的详细信息。
有人可以告诉我确保房产必须属于租赁或销售的最佳方式。
答案 0 :(得分:0)
您描述的内容会导致chicken-or-the-egg问题。您不能首先插入相应的“子表”,因为外键property_id
要求首先存在一般条目。但是你也不能先插入普通表,至少如果你能表达你在这里要求的约束。因为你不能同时插入两个表,这意味着你根本不能插入你的数据,除非你禁用一段时间的一致性检查,我认为这样的风格非常糟糕。
在数据库约束级别,我看不到干净的解决方案。因此,我建议您在应用程序级别处理可能的不一致(即未知类型的属性)。