0

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

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

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

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

4

2 回答 2

1

到目前为止,我在 invoices 表上提出了 task_id1、task_id2 等字段,它们是 task_id 字段的外键

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

不!

在 invoices 和 tasks 之间做一个多对多表,并在此 table 和 invoice 和 task 表之间进行约束。

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;
于 2013-09-02T16:58:13.900 回答
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;

这就是你所需要的

于 2013-09-02T16:58:57.450 回答