【发布时间】:2014-07-10 08:46:21
【问题描述】:
您好,我需要创建一个支持以下层次结构的组织结构:
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,但我需要我的架构独立于特定的数据库。
这是好的设计还是有更好的设计?我怀疑是因为以下问题。我可以“以某种方式”做到这一点,但我想知道最佳实践方法。
- 子组织具有国家代码外键,但国家代码已在父组织中指定。我觉得这是一种两面派。
- 如果我删除表 country 中的一行,如果数据库在删除其父组织之前尝试删除子组织,则级联删除失败?
- 所有数据库都支持外键为空吗?组织的 parent_id 为空,但自引用外键 fk_organization_organization_1 中使用了 parent_id。
- 外键中使用的国家代码是 CHAR(3)。它会更快是INT(3)吗?
我会很感激任何想法。非常感谢。沃杰科技
【问题讨论】:
标签: mysql database database-design database-schema