我无法弄清楚如何为发票系统设计数据库。我想要一张发票表和一张任务表。我希望发票表中的记录能够具有与之关联的可变数量的任务,但也保持参照完整性,以便无法添加任务表中不存在的任务。
到目前为止,我已经在发票表上提出了task_id1,task_id2等字段,这些字段是任务表中task_id字段的外键,但它感觉限制了可以放在任务中的任务数量一张发票。
或者,发票表可以有一个逗号分隔的task_id列表,它允许每个发票可变数量的任务,但是如果列类型不同,我无法弄清楚如何创建外键。 (另外这感觉有点草率)。
我确信我没有看到一个简单的答案。
答案 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;
这就是你所需要的一切