我正在开发一个处理某些公司信息的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 :(得分:0)
在MySQL中实施数据完整性是不可能的。 MySQL默默地丢弃检查约束。触发器不可靠(例如,不会为级联删除调用before insert
触发器。)即使它们是可靠的,MySQL触发器实际上也不能阻止插入行。
你最好的希望是在MySQL之上的一层强制执行业务规则。