“客户”表的数据库结构,每个客户有很多订单,每个订单有很多项

时间:2013-07-17 22:24:04

标签: sql database sqlite

我正在尝试创建一个数据库,其中每个客户有多个订单(每天新订单),每个订单都有几个项目。我曾计划创建一个客户表并为每个订单创建一个表,并使用“items”表填充该表。我认为这种方法太复杂和繁琐,因为订单的数量可以达到数千,我不认为有数千个表是可维护的。您认为适合的结构是什么?非常感谢任何帮助。

对不起,如果这是一个愚蠢的问题,我正在学习编程。这是我第一次尝试数据库设计。

4 个答案:

答案 0 :(得分:46)

你需要四个表,如下所示:

Possible Simplified Database Model

客户

包含客户列表。每位客户一排。将包含所有客户信息 - 他们的联系方式等......

订单

包含订单列表。每个订单一行。每个订单由客户下订单并具有Customer_ID - 可用于链接回客户记录。如果与其记录中的客户地址不同,或者存储地址在不同的表格中,也可能存储交货地址。

的OrderItems

包含订单商品列表。订单上每个项目占一行 - 因此每个订单可以在此表中生成多个行。订购的每件商品都是库存中的产品,因此每行都有一个product_id,它链接到products表。

产品

包含产品列表。每个产品一排。与customers表类似,但对于产品 - 包含所有产品详细信息。

以下是您可以用来创建此结构的SQL代码 - 它将为自己创建一个名为mydb的数据库:

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`Customer`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Customer` (
  `ID` INT NOT NULL ,
  `Name` TEXT NOT NULL ,
  `PhoneNo` VARCHAR(45) NULL ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Order`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Order` (
  `ID` INT NOT NULL ,
  `customer_id` INT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `fk_Order_1_idx` (`customer_id` ASC) ,
  CONSTRAINT `fk_Order_1`
    FOREIGN KEY (`customer_id` )
    REFERENCES `mydb`.`Customer` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Product`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Product` (
  `ID` INT NOT NULL ,
  `Name` VARCHAR(45) NOT NULL ,
  `Description` TEXT NULL ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`OrderItem`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`OrderItem` (
  `ID` INT NOT NULL ,
  `Order_ID` INT NOT NULL ,
  `Product_ID` INT NOT NULL ,
  `Quantity` INT NOT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `fk_OrderItem_1_idx` (`Order_ID` ASC) ,
  INDEX `fk_OrderItem_2_idx` (`Product_ID` ASC) ,
  CONSTRAINT `fk_OrderItem_1`
    FOREIGN KEY (`Order_ID` )
    REFERENCES `mydb`.`Order` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_OrderItem_2`
    FOREIGN KEY (`Product_ID` )
    REFERENCES `mydb`.`Product` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

USE `mydb` ;

答案 1 :(得分:3)

每个订单创建一个表是没有意义的。不要那样做。这不实用,不可维护。您将无法正常查询您的数据。对于初学者来说,你只需要四个这样的表

  • 客户
  • 订单
  • ORDER_ITEMS
  • 产品(或项目)

这是过于简化的 SQLFiddle 演示

答案 2 :(得分:0)

我有一个类似客户表的东西以及订单和商品表。客户的主要关键是订单的外键。然后,项目将具有与其放置的顺序匹配的外键。

3张桌子应该没问题

答案 3 :(得分:0)

只是想一想,我们不能在订单表中为许多订单商品存储逗号分隔的商品ID吗?这样就减少了对“订购商品”表的需求。