美好的一天,我需要创建一个组织结构,该结构应支持以下层次结构:
Country - Organization - User
Country - Organization - Suborganization - User
我考虑过要三张桌子。表格国家/地区(列ID为三个字母的ISO 3166-1 alpha-3):
CREATE TABLE `country` (
`id` CHAR(3) NOT NULL,
`country` VARCHAR(40) NOT NULL,
PRIMARY KEY (`id`)
);
表组织:
CREATE TABLE `organization` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`country_id` CHAR(3) NOT NULL,
`parent_id` INT(11) NULL DEFAULT NULL,
`name` VARCHAR(40) NOT NULL,
PRIMARY KEY (`id`),
INDEX `idx_organization_1` (`parent_id` ASC),
CONSTRAINT `fk_customer_country_1`
FOREIGN KEY (`country_id`)
REFERENCES `country` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_organization_organization_1`
FOREIGN KEY (`parent_id`)
REFERENCES `organization` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE
);
表用户:
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`organization_id` INT(11) NULL DEFAULT NULL,
`username` VARCHAR(45) NOT NULL,
`password` CHAR(32) NOT NULL,
PRIMARY KEY (`id`),
INDEX `idx_user_organization_1` (`organization_id` ASC),
CONSTRAINT `fk_user_organization_1`
FOREIGN KEY (`organization_id`)
REFERENCES `organization` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE);
存在表格国家/地区,以防止为组织分配不受支持的国家/地区代码。我不想使用MySql的枚举。尽管我目前正在使用MySql,但我需要我的架构独立于特定的DB。
这是好的设计还是有更好的设计?我怀疑是因为以下问题。我可以“以某种方式”做到这一点,但我想知道最佳实践方法。
子组织具有国家代码外键,但国家代码已在上级组织中指定。我觉得这是一种欺骗。
如果我在表国家/地区删除行,如果数据库在删除其父组织之前尝试删除子组织,则级联删除会失败吗?
是否所有数据库都支持外键中的null?组织具有为空的parent_id,但在自引用外键fk_organization_organization_1中使用parent_id。
外键中使用的国家/地区代码为CHAR(3)。是INT(3)会更快吗?
我将不胜感激。非常感谢。 Vojtech
最佳答案
我将使country_id为空以避免这种重复。也
您可以实施一些应用程序级别的控制,以确保
(country_id,parent_id)中的至少一个不为null。
必须删除
只要两个引用都用“ ON”定义
DELETE CASCADE”子句
我与支持人员合作过的所有数据库
可为空的外键:Oracle,DB2,MySQL,SQL Server,Postgre
差异可能微不足道
关于mysql - 层次结构国家/地区的数据库模型-组织-子组织-用户,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24672093/