2010-07-22 41 views
0

我正在開發處理有關某些公司的信息的PHP Web應用程序。到目前爲止,數據庫設計是這樣的:用於存放複雜屬性的數據庫設計

CREATE TABLE `group` (
    `group_id` int(10) unsigned NOT NULL auto_increment, 
    `group_name` varchar(50) NOT NULL, 
    PRIMARY KEY (`group_id`) 
) ENGINE=InnoDB; 

CREATE TABLE `company` (
    `company_id` int(10) unsigned NOT NULL auto_increment, 
    `company_name` varchar(50) NOT NULL, 
    `group_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`company_id`), 
    KEY `FK_company_group` (`group_id`), 
    CONSTRAINT `FK_company_group` FOREIGN KEY (`group_id`) REFERENCES `group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB; 

設計過於簡單,我需要改變它,所以它可以容納約公司類別的實際信息。總而言之,一家公司可以處於四種可能情況中的一種(並且只有一種),並可以選擇性地鏈接到另一個對象(一組或另一家公司)。類型和鏈接對象的特性取決於情況:

   - Independent   
      /   
      /    
    - Holding/     
/  \     --- Direct -> Group 
/   \    /    
/   \   /    
\    - Dependent ----- Indirect -> Company of "Direct" type      
\          
    \          
    - Subsidiary -> Company of "Holding" type         

因此公司可以「獨立報」,「直接」,「間接」或「子公司」。箭頭代表鏈接。 (對不起,如果名字沒什麼意義,我正在翻譯西班牙在飛行。)

我正在尋找一個數據庫設計來保存這些信息,並避免與InnoDB允許的不連貫性(所以你不能有一個「子公司」鏈接到一個集團或「直接」鏈接到一家公司),尤其是。當更新完成時(如果控股公司已經擁有子公司,則不應將其移入子公司)。

你能給我一些想法嗎?我自己無處可去:(

回答

0

在MySQL中強制執行數據完整性是不可能的,MySQL默默地放棄檢查約束,觸發器不可靠(例如,對於級聯刪除,不會調用before insert觸發器)。他們是可靠的,MySQL的觸發器也不能真正阻止行被插入。

你最希望的是在MySQL之上的一層強制執行業務規則。

+0

也許我沒有正確地解釋自己在我附上了樣本CREATE TABLE片段,你不能將更多的一個組分配給一個公司:因爲只有一個group_id單元,這實際上是不可能的,基本上就是我想要的完整性前夕(與外鍵一起防止在可能的情況下刪除父記錄)。我想要一個比'company'表('group_id','direct_company_id'和'holding_company_id')中的三列更好的東西,並讓PHP任務保留全部三個NULL,而不是一個NULL。 – 2010-07-22 16:28:12

+0

@ÁlvaroG. Vicario:如果您刪除父級,那麼'ON DELETE CASCADE'實際上會刪除子級公司。您可以強制執行一個組,但使用'not null'和'foreign key'作爲唯一工具,執行復雜的一組業務規則幾乎是不可能的 – Andomar 2010-07-22 16:45:05