2012-08-12 19 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要求首先存在一般條目。但是你也不能先插入到總表中,至少如果你能表達你在這裏要求的約束。因爲你不能同時插入兩個表格,這意味着你根本不能插入你的數據,除非你在一段時間內禁用一致性檢查,我認爲這是一種非常糟糕的風格。

我可以看到在數據庫約束級別沒有乾淨的解決方案。因此,我建議您在應用程序級別處理可能的不一致性(即未知類型的屬性)。