【发布时间】:2016-08-21 03:54:10
【问题描述】:
我的 POS 数据库设计有一些问题,假设我有 products 表,其中包含列 id、product_name、价格和库存,然后是表 transactions 和 transaction_details,如果有人买了一些产品,我有一个交易记录和一些交易明细记录,现在我将product表中的价格值复制到transaction_details,所以如果产品价格发生变化,它们不会影响交易历史/报告,但我考虑将价格单独放入另一个表,比如说product_prices,每个产品都有很多价格,而与product_prices 相关的transaction_details 则直接指向产品本身。我的方法是更好还是更差对应于数据本身的数据完整性、性能或效率。我在products 表中有库存,是否需要或者我只是从购买交易中获取从transaction_details 中减去unit_price。谢谢你的回答。
-- -----------------------------------------------------
-- Table `mydb`.`transaction`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`transaction` (
`id` INT NOT NULL AUTO_INCREMENT,
`date` DATETIME NOT NULL,
`total` DOUBLE UNSIGNED NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`products`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`products` (
`id` INT NOT NULL AUTO_INCREMENT,
`product_name` VARCHAR(255) NOT NULL,
`description` VARCHAR(1000) NULL,
`price` DOUBLE UNSIGNED NOT NULL,
`stocks` INT NOT NULL DEFAULT 0,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`transaction_details`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`transaction_details` (
`transaction_id` INT NOT NULL,
`products_id` INT NOT NULL,
`discount` DOUBLE NOT NULL,
`unit_price` DOUBLE NOT NULL,
`quantity` INT NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`transaction_id`, `products_id`),
INDEX `fk_transaction_details_products1_idx` (`products_id` ASC),
CONSTRAINT `fk_transaction_details_transaction`
FOREIGN KEY (`transaction_id`)
REFERENCES `mydb`.`transaction` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_transaction_details_products1`
FOREIGN KEY (`products_id`)
REFERENCES `mydb`.`products` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`purchasing`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`purchasing` (
`id` INT NOT NULL AUTO_INCREMENT,
`products_id` INT NOT NULL,
`date` DATETIME NOT NULL,
`purchasing_price` DOUBLE NOT NULL,
`quantity` INT NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`, `products_id`),
INDEX `fk_purchasing_products1_idx` (`products_id` ASC),
CONSTRAINT `fk_purchasing_products1`
FOREIGN KEY (`products_id`)
REFERENCES `mydb`.`products` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
【问题讨论】:
-
如果您希望能够提出诸如“
的价格是多少”之类的问题,那么您的设计似乎是合理的。否则它可能会变得不必要地复杂。 -
hmm 所以如果我将产品表中的价格复制到 transaction_details 就可以了,感谢向我保证,是的,我考虑跟踪产品销售数据的未来要求,特别是特定价格的最高销售统计期间。
-
我推荐一个订单明细表,它可以捕获当时交易的价格。如果你发布一个实际的模式,我可以反对它(意味着优点和缺点)
-
@Drew 我有更新可能会质疑包含简单 ERD 的图像
-
能否提供文字
show create table eachTable
标签: mysql database database-design