层次结构的数据库模型国家 - 组织 - 子组织 - 用户

时间:2014-07-10 08:46:21

标签: mysql database database-design database-schema

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

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,但我需要我的架构独立于特定的数据库。

这是一个好的设计还是有更好的设计?我怀疑是因为以下问题。我可以“某种程度上”做到这一点,但我想知道最佳实践方法。

  1. 子组织具有国家/地区代码外键,但国家/地区代码已在父组织中指定。我觉得这是一种两面派。
  2. 如果我删除表的国家/地区,如果数据库在删除子组织之前删除子组织,那么级联删除会失败吗?
  3. 所有数据库支持的外键是否为空?组织具有null parent_id,但parent_id用于自引用密钥fk_organization_organization_1。
  4. 外键中使用的国家/地区代码为CHAR(3)。 INT(3)会更快吗?
  5. 我很欣赏任何想法。非常感谢。 Vojtech

1 个答案:

答案 0 :(得分:0)

  1. 我会使country_id可以为空,以避免这种重复。也 您可以实现一些应用程序级别的控制,以确保在 (country_id,parent_id)中的至少一个不为空。
  2. 删除必须 只要用" ON定义的两个引用都是成功的 删除CASCADE"条款
  3. 我支持的所有数据库 可空的外键:Oracle,DB2,MySQL,SQL Server,Postgre
  4. 差异很可能是微不足道的