发票和任务表的参照完整性

时间:2013-09-02 16:55:46

标签: mysql database-design

我无法弄清楚如何为发票系统设计数据库。我想要一张发票表和一张任务表。我希望发票表中的记录能够具有与之关联的可变数量的任务,但也保持参照完整性,以便无法添加任务表中不存在的任务。

到目前为止,我已经在发票表上提出了task_id1,task_id2等字段,这些字段是任务表中task_id字段的外键,但它感觉限制了可以放在任务中的任务数量一张发票。

或者,发票表可以有一个逗号分隔的task_id列表,它允许每个发票可变数量的任务,但是如果列类型不同,我无法弄清楚如何创建外键。 (另外这感觉有点草率)。

我确信我没有看到一个简单的答案。

2 个答案:

答案 0 :(得分:1)

  

到目前为止,我已经提出了一个task_id1,task_id2等...字段   发票表,它是task_id字段的外键

     

或者,发票表可以有逗号分隔的列表   task_id允许每张发票可变数量的任务

NOO !!!

在发票和任务之间创建多对多表,并在此表与发票和任务表之间建立约束。

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`invoices`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`invoices` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `date` DATETIME NULL ,
  `amount` DECIMAL(7,2) NULL ,
  `whatever` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`tasks`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`tasks` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `whatever` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`invoices_has_tasks`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`invoices_has_tasks` (
  `invoices_id` INT NOT NULL ,
  `tasks_id` INT NOT NULL ,
  PRIMARY KEY (`invoices_id`, `tasks_id`) ,
  INDEX `fk_invoices_has_tasks_tasks1_idx` (`tasks_id` ASC) ,
  INDEX `fk_invoices_has_tasks_invoices_idx` (`invoices_id` ASC) ,
  CONSTRAINT `fk_invoices_has_tasks_invoices`
    FOREIGN KEY (`invoices_id` )
    REFERENCES `mydb`.`invoices` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_invoices_has_tasks_tasks1`
    FOREIGN KEY (`tasks_id` )
    REFERENCES `mydb`.`tasks` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

答案 1 :(得分:0)

创建发票表

CREATE TABLE invoice (
    invoice_id INT NOT NULL,
    PRIMARY KEY (invoice_id)
) ENGINE=INNODB;

要创建任务表,请使用

CREATE TABLE tasks (
    task_id INT, 
    invoice_id INT,
    INDEX par_ind (invoice_id),
    FOREIGN KEY (invoice_id) 
        REFERENCES invoice(invoice_id)
        ON DELETE CASCADE
) ENGINE=INNODB;

这就是你所需要的一切