数据库设计保存复杂属性

时间:2010-07-22 15:49:56

标签: mysql database-design innodb

我正在开发一个处理某些公司信息的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允许的不连贯性(因此您不能将“子公司”链接到组或链接到公司的“直接”),尤其是。更新完成后(如果已经拥有子公司,您不应该将控股公司转移到子公司)。

你能给我一些想法吗?我自己无处可去:(

1 个答案:

答案 0 :(得分:0)

在MySQL中实施数据完整性是不可能的。 MySQL默默地丢弃检查约束。触发器不可靠(例如,不会为级联删除调用before insert触发器。)即使它们是可靠的,MySQL触发器实际上也不能阻止插入行。

你最好的希望是在MySQL之上的一层强制执行业务规则。