美好的一天,我需要创建一个组织结构,该结构应支持以下层次结构:

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/

10-13 21:28