


并且 barcode”是有可能存在重复的, 所有的字段都不能唯一标识表里 的记录。这个时候,我们必须给这个表加上一个主键“itemnumber“。 然后分别拆分为下面这三个表 :



日积月累,最终会导致查询结果出现较大偏 差,影响系统的可靠性,如果删除的话只会得不偿失,系统的成本都会提高。
ER模型 是一个建模的过程 , 需要重视其中的思路 !! 下图 1表示关系只有一个 , NMQP 表示多

-- 强实体
-- 供货商表(demo.supplier)
CREATE TABLE demo.supplier
(
-- 我们给它添加一个与业务无关的字段“supplierid”为主键,并且设置自增约束。
supplierid INT PRIMARY KEY AUTO_INCREMENT,
suppliername TEXT,
address TEXT,
phone TEXT
);
-- 商品表(demo.goodsmaster)
CREATE TABLE demo.goodsmaster
(
--我们给商品信息表添加一个与业务无关的字段“itemnumber”为主键,采用手动赋值的方式,原因是可能存在多个门店录入新品,导致冲突的情况
itemnumber INT PRIMARY KEY,
barcode TEXT,
goodsname TEXT,
specification TEXT,
unit TEXT,
salesprice DECIMAL(10,2)
);
-- 门店表(demo.branch)
CREATE TABLE demo.branch
(
-- 增加一个与业务无关的字段为主键,并且设置自增约束
branchid INT PRIMARY KEY AUTO_INCREMENT,
branchno TEXT,
branchname TEXT,
address TEXT,
phone TEXT,
contacter TEXT
);
-- 弱实体
-- 仓库表(demo.stock)
CREATE TABLE demo.stock
(
--添加与业务无关的自增约束字段为主键
stockid INT PRIMARY KEY AUTO_INCREMENT,
-- 仓库是弱实体,依赖于强实体门店表,所以要把门店表的主键字段包括进来,作为与门店表关联的外键
branchid INT NOT NULL,
stockno TEXT NOT NULL,
stockname TEXT NOT NULL,
-- 设置外键约束,与门店表关联
CONSTRAINT fk_stock_branch FOREIGN KEY (branchid) REFERENCES branch (branchid)
- );
-- 收银款台表(demo.cashier)
mysql> CREATE TABLE demo.stock
-> (
-> --添加与业务无关的自增约束字段为主键
-> stockid INT PRIMARY KEY AUTO_INCREMENT,
-> -- 仓库是弱实体,依赖于强实体门店表,所以要把门店表的主键字段包括进来,作为与门店表关联的外键
-> branchid INT NOT NULL,
-> stockno TEXT NOT NULL,
-> stockname TEXT NOT NULL,
-> -- 设置外键约束,与门店表关联
-> CONSTRAINT fk_stock_branch FOREIGN KEY (branchid) REFERENCES branch (branchid)
-> );
-- 员工表(demo.operator)
mysql> CREATE TABLE demo.operator
-> (
-> -- 添加与业务无关的自增字段为主键
-> operatorid INT PRIMARY KEY AUTO_INCREMENT,
-> -- 员工是弱实体,依赖于强实体门店表,所以要把门店表的主键字段包括进来,所为与门店表关联的外键
-> branchid INT NOT NULL,
-> workno TEXT NOT NULL,
-> operatorname TEXT NOT NULL,
-> phone TEXT,
-> address TEXT,
-> pid TEXT,
-> duty TEXT,
-> -- 设置外键约束,与门店表关联
-> CONSTRAINT fk_operator_branch FOREIGN KEY (branchid) REFERENCES branch (branchid)
-> );
-- 会员表(demo.membermaster)
mysql> CREATE TABLE demo.membermaster
-> (
-> -- 添加与业务无关的自增字段为主键
-> memberid INT PRIMARY KEY,
-> -- 会员是弱实体,依赖于强实体门店表,所以要把门店表的主键字段包括进来,所为与门店表关联的外键
-> branchid INT NOT NULL,
-> cardno TEXT NOT NULL,
-> membername TEXT,
-> address TEXT,
-> phone TEXT,
-> pid TEXT,
-> -- 设置默认约束,积分默认为0
-> memberpoints DECIMAL(10,1) NOT NULL DEFAULT 0,
-> -- 设置默认约束,储值默认为0
-> memberdeposit DECIMAL(10,2) NOT NULL DEFAULT 0,
-> -- 设置外键约束,与门店表关联
-> CONSTRAINT fk_member_branch FOREIGN KEY (branchid) REFERENCES branch (branchid)
-> );
--多对多的关系转换成一个数据表
-- 数据表设计的第三范式的要求和业务优先的原则
--进货单表拆分成 进货单头表和进货单明细表
CREATE TABLE demo.importhead
(
importid INT PRIMARY KEY, -- 添加与业务无关的字段为主键
listnumber TEXT NOT NULL, -- NOT NULL 非空约束
supplierid INT NOT NULL, -- 供货商表的主键,反映了参与进货关系的供货商信息
stockid INT NOT NULL, -- 仓库表的主键,反映了参与进货关系的仓库信息
operatorid INT NOT NULL, -- 员工表的主键,反映了参与进货关系的员工信息
recordingdate DATETIME NOT NULL,
totalquantity DECIMAL(10,3) NOT NULL DEFAULT 0,
totalvalue DECIMAL(10,3) NOT NULL DEFAULT 0,
-- 通过外键来表达 1 对多的关系d
CONSTRAINT fk_importhead_supplier FOREIGN KEY (supplierid) REFERENCES supplier (supplierid),
CONSTRAINT fk_transactionhead_member FOREIGN KEY (memberid) REFERENCES membermaster (memberid),
CONSTRAINT fk_importhead_operator FOREIGN KEY (operatorid) REFERENCES operator (operatorid)
);
CREATE TABLE demo.importdetails
(
importid INT,
itemnumber INT, -- 商品表的主键,反映了参与进货关系的商品信息
importquantity DECIMAL(10,3) NOT NULL DEFAULT 0,
importprice DECIMAL(10,2) NOT NULL DEFAULT 0,
importvalue DECIMAL(10,2) NOT NULL DEFAULT 0,
PRIMARY KEY (importid,itemnumber),
CONSTRAINT fk_importdetails_goodsmaster FOREIGN KEY (itemnumber) REFERENCES goodsmaster (itemnumber)
);
-- 流水单表拆分成流水单头表和流水单明细表
CREATE TABLE demo.transactionhead
(
transactionid INT PRIMARY KEY, -- 添加与业务无关的字段为主键
transactionno TEXT NOT NULL,
cashierid INT NOT NULL, -- 收款机表的主键,反映了参与零售关系的收款机信息
memberid INT, -- 会员表的主键,反映了参与零售关系的会员的信息
operatorid INT NOT NULL, -- 员工表的主键,反映了参与零售关系的员工信息
transdate DATETIME NOT NULL,
-- 通过外键来表达 1 对多的关系
CONSTRAINT fk_transactionhead_cashier FOREIGN KEY (cashierid) REFERENCES cashier (cashierid),
CONSTRAINT fk_transactionhead_member FOREIGN KEY (memberid) REFERENCES member (memberid),
CONSTRAINT fk_transactionhead_operator FOREIGN KEY (operatorid) REFERENCES operator (operatorid)
);
CREATE TABLE demo.transactiondetails
(
transactionid INT,
itemnumber INT, -- 商品表的主键,反映了参与零售关系的商品信息
quantity DECIMAL(10,3) NOT NULL DEFAULT 0,
price DECIMAL(10,2) NOT NULL DEFAULT 0,
salesvalue DECIMAL(10,2) NOT NULL DEFAULT 0,
PRIMARY KEY (transactionid,itemnumber),
CONSTRAINT fk_transactiondetails_goodsmaster FOREIGN KEY (itemnumber) REFERENCES goodsmaster (itemnumber)
);