このチュートリアルでは、在庫管理システムのデータベーススキーマを設計して、サプライヤ、販売員、アイテム、アイテムの在庫、発注書、および顧客の注文を管理するための完全な手順を説明します。
メモ :一般的に、小売業および製造業の企業は在庫システムを採用しています。他の業界で広く使用されているユースケースの中で、このデータベーススキーマは、たとえば病院の在庫管理に使用して、ヘルスケアサプライチェーンの効率を高め、投薬の無駄を減らすことができます。
実体関連図または視覚的なデータベース設計を以下に示します。
在庫管理データベース
また、Ubuntu 20.04LTSにMySQL8をインストールする方法、WindowsにMySQL 8をインストールする方法、UbuntuにMySQL Workbenchをインストールする方法、Windows10にWorkbenchを使用してMySQL8をインストールする方法、MySqlのRBACデータベースなどの人気のあるチュートリアルにアクセスすることもできます。 MySqlのブログデータベース、MySQLのクイズデータベース、MySQLのPoll&Surveyデータベース、MySQLのオンラインショッピングカートデータベース、MySQLの基本的なSQLクエリを学ぶ。
在庫データベース
最初のステップは、インベントリデータベースを作成することです。以下に示すクエリを使用して作成できます。
CREATE SCHEMA `inventory` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
文字セットutf8mb4を使用しました 幅広いキャラクターをサポートします。
ユーザーテーブル
このセクションでは、ユーザーテーブルを設計します ユーザー情報を保存します。ユーザーは自分のプロファイルを管理できます。また、ユーザーは自分に割り当てられた役割に応じてアプリケーションを使用できます。 MySqlのチュートリアルRBACデータベースを参照して、役割と権限を管理するための完全なRBACシステムを実装することもできます。以下は、ユーザーテーブルのすべての列の説明です。
ユーザーを識別するための一意のID。 |
ユーザーの役割。管理者、サプライヤー、営業担当者、顧客のいずれでもかまいません。 |
ユーザーの名。 |
ユーザーのミドルネーム。 |
ユーザーの名前。 |
ユーザーの携帯電話番号。ログインと登録の目的で使用できます。 |
ユーザーのメールアドレス。ログインと登録の目的で使用できます。 |
適切なアルゴリズムによって生成されたパスワードハッシュ。プレーンなパスワードや暗号化されたパスワードの保存は避けなければなりません。 |
この列は、アプリケーションを使用しているユーザーの寿命を計算するために使用できます。 |
ユーザーの最後のログインを識別するために使用できます。 |
ユーザーの簡単な紹介。 |
ユーザーの詳細。 |
適切な制約のあるユーザーテーブルを以下に示します。
CREATE TABLE `inventory`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`roleId` SMALLINT NOT NULL,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`username` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
製品テーブル
このセクションでは、製品テーブルを設計します 製品データを保存します。以下は、製品テーブルのすべての列の説明です。
製品を識別するための一意のID。 |
インベントリに表示される製品タイトル。 |
主なハイライトに言及する要約。 |
異なる製品タイプを区別するためのタイプ。 |
製品が作成された日時を保存します。 |
製品が更新された日時を保存します。 |
製品の追加の詳細を保存するために使用される列。 |
適切な制約のある製品テーブルを以下に示します。
CREATE TABLE `inventory`.`product` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`summary` TINYTEXT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
製品メタ
製品メタテーブルは、製品バナーURLなどの製品に関する追加情報を格納するために使用できます。以下は、製品メタテーブルのすべての列の説明です。
製品メタを識別するための一意のID。 |
親製品を識別するための製品ID。 |
メタを識別するキー。 |
商品のメタデータを保存するために使用される列。 |
適切な制約のある製品メタテーブルは次のとおりです。
CREATE TABLE `inventory`.`product_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_product` (`productId` ASC),
UNIQUE INDEX `uq_product_meta` (`productId` ASC, `key` ASC),
CONSTRAINT `fk_meta_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
カテゴリテーブルと製品カテゴリテーブル
このセクションでは、カテゴリテーブルを設計します および製品カテゴリテーブル 製品カテゴリとそのマッピングを保存します。以下は、カテゴリテーブルのすべての列の説明です。
カテゴリを識別するための一意のID。 |
親カテゴリを識別するための親ID。 |
カテゴリタイトル。 |
ブラウザのタイトルとSEOに使用されるメタタイトル。 |
URLを形成するためのカテゴリスラッグ。 |
カテゴリの詳細を保存するために使用される列。 |
適切な制約のあるカテゴリテーブルは次のとおりです。
CREATE TABLE `inventory`.`category` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`parentId` BIGINT NULL DEFAULT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL DEFAULT NULL,
`slug` VARCHAR(100) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`));
ALTER TABLE `inventory`.`category`
ADD INDEX `idx_category_parent` (`parentId` ASC);
ALTER TABLE `inventory`.`category`
ADD CONSTRAINT `fk_category_parent`
FOREIGN KEY (`parentId`)
REFERENCES `inventory`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
以下は、製品カテゴリテーブルのすべての列の説明です。
商品を識別するための商品ID。 |
カテゴリを識別するためのカテゴリID。 |
適切な制約のある製品カテゴリテーブルは次のとおりです。
CREATE TABLE `inventory`.`product_category` (
`productId` BIGINT NOT NULL,
`categoryId` BIGINT NOT NULL,
PRIMARY KEY (`productId`, `categoryId`),
INDEX `idx_pc_category` (`categoryId` ASC),
INDEX `idx_pc_product` (`productId` ASC),
CONSTRAINT `fk_pc_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_pc_category`
FOREIGN KEY (`categoryId`)
REFERENCES `inventory`.`category` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ブランドテーブル
このセクションでは、ブランドテーブルを設計します ブランドデータを保存します。以下は、ブランドテーブルのすべての列の説明です。
ブランドを識別するための一意のID。 |
インベントリに表示されるブランドタイトル。 |
要約には主なハイライトが記載されています。 |
製品が作成された日時を保存します。 |
製品が更新された日時を保存します。 |
ブランドの追加の詳細を保存するために使用される列。 |
適切な制約のあるブランドテーブルを以下に示します。
CREATE TABLE `inventory`.`brand` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`summary` TINYTEXT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
注文テーブルテーブル
このセクションでは、在庫注文を管理するための表を提供します。注文は、サプライヤーまたは顧客のいずれかに関連付けることができます。以下は、注文テーブルのすべての列の説明です。
注文を識別するための一意のID。 |
注文に関連付けられたサプライヤーまたは顧客を識別するためのユーザーID。 |
発注書または顧客注文を区別するための注文タイプ。 |
注文のステータスは、[新規]、[チェックアウト]、[支払い済み]、[失敗]、[発送済み]、[配信済み]、[返品済み]、[完了]のいずれかになります。 |
注文アイテムの合計金額。 |
注文アイテムの合計割引。 |
注文アイテムに対する税金。 |
注文商品の送料。 |
注文の合計金額(税金と送料を含む)。アイテム割引は含まれません。 |
注文のプロモーションコード。 |
プロモーションコードまたはストア割引に基づく注文の合計割引。 |
購入者が支払う注文の総計。 |
注文が作成された日時が保存されます。 |
注文が更新された日時が保存されます。 |
注文の追加の詳細を保存するために使用される列。 |
適切な制約のある注文表は次のとおりです。
CREATE TABLE `inventory`.`order` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`subTotal` FLOAT NOT NULL DEFAULT 0,
`itemDiscount` FLOAT NOT NULL DEFAULT 0,
`tax` FLOAT NOT NULL DEFAULT 0,
`shipping` FLOAT NOT NULL DEFAULT 0,
`total` FLOAT NOT NULL DEFAULT 0,
`promo` VARCHAR(50) NULL DEFAULT NULL,
`discount` FLOAT NOT NULL DEFAULT 0,
`grandTotal` FLOAT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_user` (`userId` ASC),
CONSTRAINT `fk_order_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
アドレステーブル
このセクションでは、ユーザーまたは注文のいずれかのアドレスを管理するためのテーブルを提供します。ユーザーアドレスは、ユーザーに関連付けられたアドレスを格納するために使用できます。注文先住所は、宅配注文の配送先住所を保存するために使用できます。以下は、アドレステーブルのすべての列の説明です。
アドレスを識別するための一意のID。 |
アドレスに関連付けられているユーザーを識別するためのユーザーID。 |
アドレスに関連付けられている注文を識別するための注文ID。 |
ユーザーの名。 |
ユーザーのミドルネーム。 |
ユーザーの名前。 |
ユーザーの携帯電話番号。 |
ユーザーのメールアドレス。 |
住所を保存する最初の行。 |
住所を保存する2行目。 |
住所の都市。 |
住所の州。 |
住所の国。 |
注文が作成された日時が保存されます。 |
注文が更新された日時が保存されます。 |
適切な制約のあるアドレステーブルは次のとおりです。
CREATE TABLE `inventory`.`address` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NULL DEFAULT NULL,
`orderId` BIGINT NULL DEFAULT NULL,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`line1` VARCHAR(50) NULL DEFAULT NULL,
`line2` VARCHAR(50) NULL DEFAULT NULL,
`city` VARCHAR(50) NULL DEFAULT NULL,
`province` VARCHAR(50) NULL DEFAULT NULL,
`country` VARCHAR(50) NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_address_user` (`userId` ASC),
CONSTRAINT `fk_address_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`address`
ADD INDEX `idx_address_order` (`orderId` ASC);
ALTER TABLE `inventory`.`address`
ADD CONSTRAINT `fk_address_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
アイテムテーブル
このセクションでは、アイテムをデザインします テーブル アイテムの詳細を保存します。アイテムは、在庫に在庫があり、サプライヤーから購入したアイテムを表します。以下は、アイテムテーブルのすべての列の説明です。
アイテムを識別するための一意のID。 |
在庫アイテムに関連付けられている商品を識別するための商品ID。 |
在庫アイテムに関連付けられているブランドを識別するためのブランドID。 |
在庫アイテムに関連付けられているサプライヤを識別するサプライヤID。 |
在庫アイテムに関連付けられている注文を識別するための注文ID。 |
インベントリアイテムを追加したユーザーを識別するためのユーザーID。 |
インベントリアイテムを更新したユーザーを識別するためのユーザーID。 |
在庫のある商品を識別するためのID。 |
商品に関連付けられている商品の印刷価格。 |
割引はサプライヤーによって提供されます。 |
製品を購入したときの価格。 |
在庫で受け取った合計数量。 |
顧客に販売された合計数量。 |
在庫で利用可能な数量。 |
在庫で受け取った、または顧客から返品された不良品の合計。 |
注文が作成された日時が保存されます。 |
注文が更新された日時が保存されます。 |
適切な制約のあるアイテムテーブルは次のとおりです。
CREATE TABLE `inventory`.`item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`brandId` BIGINT NOT NULL,
`supplierId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`mrp` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`price` FLOAT NOT NULL DEFAULT 0,
`quantity` SMALLINT(6) NOT NULL DEFAULT 0,
`sold` SMALLINT(6) NOT NULL DEFAULT 0,
`available` SMALLINT(6) NOT NULL DEFAULT 0,
`defective` SMALLINT(6) NOT NULL DEFAULT 0,
`createdBy` BIGINT NOT NULL,
`updatedBy` BIGINT DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_item_product` (`productId` ASC),
CONSTRAINT `fk_item_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_brand` (`brandId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_brand`
FOREIGN KEY (`brandId`)
REFERENCES `inventory`.`brand` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_user` (`supplierId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_user`
FOREIGN KEY (`supplierId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `inventory`.`item`
ADD INDEX `idx_item_order` (`orderId` ASC);
ALTER TABLE `inventory`.`item`
ADD CONSTRAINT `fk_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
注文アイテムテーブル
このセクションでは、顧客が購入した注文アイテムを管理するための表を提供します。以下は、注文アイテムテーブルのすべての列の説明です。
注文した商品を識別するための一意のID。 |
注文した商品に関連付けられている商品を識別するための商品ID。 |
注文したアイテムに関連付けられているアイテムを識別するためのアイテムID。 |
注文されたアイテムに関連付けられた注文を識別するための注文ID。 |
購入時の製品のSKU。 |
購入時の製品の価格。 |
購入時の商品の割引。 |
ユーザーが選択した商品の数量。 |
注文したアイテムが作成された日時が保存されます。 |
注文した商品が更新された日時が保存されます。 |
注文した商品の詳細を保存するために使用される列。 |
適切な制約のある注文アイテムテーブルは次のとおりです。
CREATE TABLE `inventory`.`order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`productId` BIGINT NOT NULL,
`itemId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`sku` VARCHAR(100) NOT NULL,
`price` FLOAT NOT NULL DEFAULT 0,
`discount` FLOAT NOT NULL DEFAULT 0,
`quantity` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_order_item_product` (`productId` ASC),
CONSTRAINT `fk_order_item_product`
FOREIGN KEY (`productId`)
REFERENCES `inventory`.`product` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`order_item`
ADD INDEX `idx_order_item_item` (`itemId` ASC);
ALTER TABLE `inventory`.`order_item`
ADD CONSTRAINT `fk_order_item_item`
FOREIGN KEY (`itemId`)
REFERENCES `inventory`.`item` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `inventory`.`order_item`
ADD INDEX `idx_order_item_order` (`orderId` ASC);
ALTER TABLE `inventory`.`order_item`
ADD CONSTRAINT `fk_order_item_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
トランザクションテーブル
また、バイヤーによる注文の支払いを追跡し、簿記を行うためのトランザクションテーブルも必要です。同じテーブルを使用して、注文の一部または全額の払い戻しを記録することもできます。以下は、トランザクションテーブルのすべての列の説明です。
トランザクションを識別するための一意のID。 |
トランザクションに関連付けられているユーザーを識別するためのユーザーID。 |
トランザクションに関連付けられた注文を識別するための注文ID。 |
支払いゲートウェイによって提供される支払いID。 |
注文トランザクションのタイプは、クレジットまたはデビットのいずれかです。 |
注文トランザクションのモードは、オフライン、代金引換、小切手、ドラフト、有線、オンラインのいずれかです。 |
注文トランザクションのステータスは、新規、キャンセル、失敗、保留中、拒否、拒否、成功のいずれかになります。 |
注文トランザクションが作成された日時が保存されます。 |
注文トランザクションが更新された日時が保存されます。 |
トランザクションの追加の詳細を格納するために使用される列。 |
適切な制約のあるトランザクションテーブルは次のとおりです。
CREATE TABLE `inventory`.`transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`orderId` BIGINT NOT NULL,
`code` VARCHAR(100) NOT NULL,
`type` SMALLINT(6) NOT NULL DEFAULT 0,
`mode` SMALLINT(6) NOT NULL DEFAULT 0,
`status` SMALLINT(6) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_transaction_user` (`userId` ASC),
CONSTRAINT `fk_transaction_user`
FOREIGN KEY (`userId`)
REFERENCES `inventory`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `inventory`.`transaction`
ADD INDEX `idx_transaction_order` (`orderId` ASC);
ALTER TABLE `inventory`.`transaction`
ADD CONSTRAINT `fk_transaction_order`
FOREIGN KEY (`orderId`)
REFERENCES `inventory`.`order` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
概要
このチュートリアルでは、ユーザーを保存し、製品の在庫を管理するための在庫管理システムのデータベース設計について説明しました。また、発注書と顧客注文を管理するためのデータベース設計も提供しました。
コメントを送信して、ディスカッションに参加できます。 BlogおよびPoll&Surveyアプリケーションのデータベースの設計にも興味があるかもしれません。完全なデータベーススキーマはGitHubでも入手できます。