2012-08-12 63 views
3

我有三个表:SQL的执行上分台的参照完整性

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

是的,这是正确的属性可能属于销售或租赁。不过,我需要提出一个约束,指出属性必须属于这些表中的任何一个。换句话说,它必须是销售或出租物业。它不能不属于租赁或销售。目前它可以独立创建。 – 2012-08-12 10:45:09

+0

我认为这叫做Polymorphic Associations – 2012-08-12 10:47:39

+1

一个建议是增加出租和销售到财产表和CHECK(property_rental_id IS NOT NULL或property_sales_id不是NULL) - 有谁知道这是可能的吗? – 2012-08-12 12:29:28

回答

0

你所描述的将导致chicken-or-the-egg问题。您无法首先插入适当的“子表”,因为外键property_id要求首先存在一般条目。但是你也不能先插入到总表中,至少如果你能表达你在这里要求的约束。因为你不能同时插入两个表格,这意味着你根本不能插入你的数据,除非你在一段时间内禁用一致性检查,我认为这是一种非常糟糕的风格。

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