我正在try 创建一个数据库,其中每个客户都有几个订单(每天都有新订单),每个订单都有几个项目.我计划创建一个Customers表, for each 订单创建一个表,并用一个"Items"表填充这个表.我认为这种方式太复杂太麻烦了,因为订单数量可以达到几千张,我不认为有几千张桌子是可以维护的.你认为什么样的 struct 才是合适的呢?如有任何帮助,我们将不胜感激.

抱歉,如果这是一个下流的问题,我正在学习编程.这是我第一次try 数据库设计.

推荐答案

你需要四张桌子,大概是这样的:

Possible Simplified Database Model

客户

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

订单

包含订单列表.每个订单占一行.每个订单都是由一个客户下的,并且有一个Customer_ID-可以用来链接回客户记录.还可以存储递送地址(如果与客户记录中的客户地址不同),或者将地址存储在单独的表中.

订单项

包含订单项的列表.订单上的每个项目对应一行——因此每个订单可以在该表中生成多行.订购的每个商品都是库存中的一个产品,因此每行都有一个product_id,该id链接到products表.

产品

包含产品列表.每种产品占一行.类似于客户表,但对于产品-包含所有产品详细信息.

下面是可以用来创建此 struct 的SQL代码——它将为自己创建一个名为mydb的数据库:

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

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


-- -----------------------------------------------------
-- Table `mydb`.`订单`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`订单` (
  `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`.`客户` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


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


-- -----------------------------------------------------
-- Table `mydb`.`订单项`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`订单项` (
  `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`.`订单` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_OrderItem_2`
    FOREIGN KEY (`Product_ID` )
    REFERENCES `mydb`.`产品` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

USE `mydb` ;

Database相关问答推荐

在使用FT.AGGREGATE聚合数据时,如何在Redis上解析ISO 8601时间?

如何将 Scylla DB 中的计数器列重置为零?

如何将 Grails 3.0 连接到我的本地 Mysql 数据库

WAMP 的 MySQL 数据库文件位于何处?

为什么null不等于null false

在 MongoDB 中模拟关系

无法启动 MongoDB:Windows 中的系统错误 1067

处理hibernate entities上的数据库视图的优雅方法?

HTML5 数据库存储 (SQL lite) - 几个问题

数据库中一致且全面的地址存储的最佳实践

您如何在数据库中构造配置数据?

在默认路径下使用脚本创建数据库?

我如何做大于/小于使用 MongoDB?

cURL 和 PHP 显示1

标准化人类皮肤 colored颜色 以进行用户交互

XML、CSV 或数据库格式的 ICD-9 代码列表

最小覆盖和功能依赖

如何在 SQL Server 中删除多个数据库

Spring data : CrudRepository 的保存方法和更新

python3k中的sqlite3中的cursor.rowcount总是-1