我正在開發處理有關某些公司的信息的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允許的不連貫性(所以你不能有一個「子公司」鏈接到一個集團或「直接」鏈接到一家公司),尤其是。當更新完成時(如果控股公司已經擁有子公司,則不應將其移入子公司)。
你能給我一些想法嗎?我自己無處可去:(
也許我沒有正確地解釋自己在我附上了樣本CREATE TABLE片段,你不能將更多的一個組分配給一個公司:因爲只有一個group_id單元,這實際上是不可能的,基本上就是我想要的完整性前夕(與外鍵一起防止在可能的情況下刪除父記錄)。我想要一個比'company'表('group_id','direct_company_id'和'holding_company_id')中的三列更好的東西,並讓PHP任務保留全部三個NULL,而不是一個NULL。 – 2010-07-22 16:28:12
@ÁlvaroG. Vicario:如果您刪除父級,那麼'ON DELETE CASCADE'實際上會刪除子級公司。您可以強制執行一個組,但使用'not null'和'foreign key'作爲唯一工具,執行復雜的一組業務規則幾乎是不可能的 – Andomar 2010-07-22 16:45:05