3

我有三张桌子:

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 对销售和出租的财产都是陌生的。然而,使用这种结构,用户实际上可以创建不属于出租或销售的财产。我需要设置一些限制,因此必须在销售表或租赁表中都有一个属性。

然后我需要查询以查找所有属性和相关的详细信息。

有人可以让我知道在这种情况下确保房产必须属于出租或销售的最佳方式吗?

4

1 回答 1

0

您所描述的将导致先有鸡还是先有蛋的问题。您不能先插入适当的“子表”,因为外键property_id要求一般条目首先存在。但是你也不能先插入到通用表中,至少如果你可以表达你在这里要求的约束的话。而且由于您不能同时插入两个表,这意味着您根本无法插入数据,除非您暂时禁用一致性检查,我认为这是非常糟糕的风格。

在数据库约束级别,我看不到任何干净的解决方案。所以我建议您在应用程序级别处理可能的不一致(即未知类型的属性)。

于 2012-08-12T12:53:45.943 回答