Структура базы данных для таблицы "клиент", имеющая много заказов на одного клиента и много элементов на заказ - программирование

Структура базы данных для таблицы "клиент", имеющая много заказов на одного клиента и много элементов на заказ

Я пытаюсь создать базу данных, где каждый клиент имеет несколько заказов (новые заказы ежедневно), и каждый заказ имеет несколько элементов. Я планировал создать таблицу клиентов и создать таблицу за заказ и заполнить эту таблицу таблицей "items". Я думаю, что этот подход слишком сложный и громоздкий, так как количество заказов может достигать тысяч, я не думаю, что тысячи таблиц можно обслуживать. Как вы думаете, для чего это будет подходящей структурой? Любая помощь приветствуется.

Извините, если это вопрос noobish, я учусь программировать. И это моя первая попытка создания базы данных.

4b9b3361

Ответ 1

Вам нужны четыре таблицы, что-то вроде этого:

Possible Simplified Database Model

Клиенты

Содержит список клиентов. Одна строка для каждого клиента. Будет содержать всю информацию о клиентах - их контактные данные и т.д.

Заказы

Содержит список заказов. Одна строка за заказ. Каждый заказ размещается клиентом и имеет Customer_ID - который можно использовать для ссылки на запись клиента. Возможно также сохранить адрес доставки, если он отличается от адреса клиентов от их записи, или сохранить адреса в отдельных таблицах.

ТоварыЗаказа

Содержит список элементов заказа. Одна строка для каждого элемента в заказе - поэтому каждый заказ может генерировать несколько строк в этой таблице. Каждый упорядоченный элемент является продуктом из вашего инвентаря, поэтому каждая строка имеет product_id, которая ссылается на таблицу продуктов.

Содержит список продуктов. Один ряд на продукт. Подобно таблице клиентов, но для продуктов - содержит все детали продукта.

Вот код 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` ;

Ответ 2

Нет смысла создавать таблицу за заказ. Не делай этого. Это не практично, не ремонтируется. Вы не сможете нормально запрашивать свои данные. Для начала всего вам нужно всего четыре таблицы, например,

  • клиентов
  • Заказы
  • order_items
  • продукты (или элементы)

Здесь приведено упрощенное SQLFiddle demo

Ответ 3

У меня будет что-то вроде таблицы клиентов, а также таблицы заказов и элементов. Первичный ключ клиента - это внешний ключ заказа. Затем элементы будут иметь внешний ключ, соответствующий порядку его размещения.

3 таблицы должны быть точными

Ответ 4

Просто мысль, не можем ли мы хранить разделенные запятыми идентификаторы товаров в таблице заказов для многих товаров? Таким образом, уменьшая необходимость таблицы "пункт заказа".