web-dev-qa-db-ja.com

顧客ごとの注文が多く、注文ごとのアイテムが多い「顧客」テーブルのデータベース構造

各顧客が複数の注文(毎日新しい注文)を持ち、各注文に複数のアイテムがあるデータベースを作成しようとしています。顧客のテーブルを作成し、注文ごとにテーブルを作成し、このテーブルに「アイテム」テーブルを追加することを計画していました。注文の数が数千に達する可能性があるため、このアプローチは複雑すぎて面倒だと思います。これに適切な構造は何だと思いますか?どんな助けも大歓迎です。

これが初心者向けの質問なら申し訳ありませんが、私はプログラムを学んでいます。そして、これはデータベース設計における私の初めての試みです。

19
edferda

次のような4つのテーブルが必要です。

Possible Simplified Database Model

お客さま

顧客のリストが含まれています。顧客ごとに1行。連絡先の詳細など、すべての顧客情報が含まれます。

ご注文

注文のリストが含まれています。注文ごとに1行。各注文は顧客によって行われ、Customer_ID-顧客レコードにリンクするために使用できます。記録から顧客の住所と異なる場合は、配達先住所を保存することもできます-または、住所を別のテーブルに保存します。

OrderItems

注文アイテムのリストが含まれています。注文のアイテムごとに1行-したがって、各注文はこのテーブルに複数の行を生成できます。注文された各アイテムは在庫からの製品であるため、各行にはproductテーブルにリンクするproduct_idがあります。

製品

製品のリストが含まれています。製品ごとに1行。 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` ;
49
Duncan Lock

注文ごとにテーブルを作成しても意味がありません。しないでください。実用的ではなく、保守もできません。通常、データをクエリすることはできません。まず最初に、このような4つのテーブルだけが必要です。

  • 顧客
  • 注文
  • order_items
  • 製品(またはアイテム)

簡単すぎますSQLFiddleデモ

3
peterm

顧客テーブルと注文およびアイテムテーブルのようなものがあります。顧客の主キーは注文の外部キーです。アイテムには、それが置かれた注文と一致する外部キーがあります。

3つのテーブルで構いません

0
null

多くの注文商品の注文テーブルにコンマ区切りの商品IDを保存することはできませんか?したがって、「注文項目」テーブルの必要性を減らします。

0
Dhaval H. Nena