商场管理数据库源代码,帮你快速搭建高效又实用的商务管理系统
- 问答
- 2026-01-03 12:29:00
- 2
(来源:CSDN博客 -《商场管理系统数据库设计》)

这是一个用于商场管理的SQL Server数据库脚本示例,这个脚本包含了创建数据库、数据表以及一些基础数据的过程,这只是一个基础框架,实际商用需要根据具体需求进行大量扩充和优化。

-- 创建数据库
CREATE DATABASE ShoppingMallDB;
GO
USE ShoppingMallDB;
GO
-- 1. 创建部门表
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY IDENTITY(1,1), -- 部门编号,主键,自增长
DepartmentName NVARCHAR(50) NOT NULL, -- 部门名称
ManagerID INT, -- 部门经理ID(关联员工表)
Description NVARCHAR(255) -- 部门描述
);
GO
-- 2. 创建员工表
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY IDENTITY(1,1), -- 员工编号,主键,自增长
EmployeeName NVARCHAR(50) NOT NULL, -- 员工姓名
Gender NVARCHAR(10), -- 性别
PhoneNumber NVARCHAR(20), -- 电话号码
HireDate DATE, -- 入职日期
Salary DECIMAL(10,2), -- 工资
DepartmentID INT FOREIGN KEY REFERENCES Departments(DepartmentID) -- 所属部门,外键
);
GO
-- 为部门表添加外键约束,指向员工表(经理也是员工)
ALTER TABLE Departments
ADD CONSTRAINT FK_Departments_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(EmployeeID);
GO
-- 3. 创建供应商表
CREATE TABLE Suppliers (
SupplierID INT PRIMARY KEY IDENTITY(1,1), -- 供应商编号
SupplierName NVARCHAR(100) NOT NULL, -- 供应商名称
ContactPerson NVARCHAR(50), -- 联系人
Phone NVARCHAR(20), -- 联系电话
Address NVARCHAR(255) -- 地址
);
GO
-- 4. 创建商品类别表
CREATE TABLE Categories (
CategoryID INT PRIMARY KEY IDENTITY(1,1), -- 商品类别编号
CategoryName NVARCHAR(50) NOT NULL, -- 类别名称
ParentCategoryID INT NULL, -- 父级类别ID(用于多级分类)
FOREIGN KEY (ParentCategoryID) REFERENCES Categories(CategoryID) -- 自关联外键
);
GO
-- 5. 创建商品信息表
CREATE TABLE Products (
ProductID INT PRIMARY KEY IDENTITY(1,1), -- 商品编号
ProductName NVARCHAR(100) NOT NULL, -- 商品名称
CategoryID INT FOREIGN KEY REFERENCES Categories(CategoryID), -- 商品类别
SupplierID INT FOREIGN KEY REFERENCES Suppliers(SupplierID), -- 供应商
UnitPrice DECIMAL(10,2) NOT NULL, -- 单价
UnitInStock INT DEFAULT 0, -- 库存数量
ReorderLevel INT, -- 库存预警线
Discontinued BIT DEFAULT 0 -- 是否下架(0在售,1下架)
);
GO
-- 6. 创建会员表
CREATE TABLE Members (
MemberID INT PRIMARY KEY IDENTITY(1,1), -- 会员编号
MemberName NVARCHAR(50) NOT NULL, -- 会员姓名
PhoneNumber NVARCHAR(20) UNIQUE, -- 手机号(唯一)
Points INT DEFAULT 0, -- 积分
RegistrationDate DATE DEFAULT GETDATE() -- 注册日期
);
GO
-- 7. 创建销售主表(订单头)
CREATE TABLE SalesOrders (
OrderID INT PRIMARY KEY IDENTITY(1,1), -- 订单编号
OrderDate DATETIME DEFAULT GETDATE(), -- 下单时间
MemberID INT FOREIGN KEY REFERENCES Members(MemberID), -- 会员ID(非会员可为空)
TotalAmount DECIMAL(10,2) DEFAULT 0, -- 订单总金额
CashierID INT FOREIGN KEY REFERENCES Employees(EmployeeID), -- 收银员
PaymentMethod NVARCHAR(20) -- 支付方式(现金、刷卡、扫码等)
);
GO
-- 8. 创建销售明细表(订单行项目)
CREATE TABLE SalesOrderDetails (
DetailID INT PRIMARY KEY IDENTITY(1,1), -- 明细项ID
OrderID INT FOREIGN KEY REFERENCES SalesOrders(OrderID), -- 所属订单
ProductID INT FOREIGN KEY REFERENCES Products(ProductID), -- 商品
UnitPrice DECIMAL(10,2) NOT NULL, -- 成交单价
Quantity INT NOT NULL, -- 购买数量
SubTotal AS (UnitPrice * Quantity) -- 小计(计算列)
);
GO
-- 9. 创建库存变更记录表(进货/盘点等)
CREATE TABLE InventoryTransactions (
TransactionID INT PRIMARY KEY IDENTITY(1,1), -- 交易ID
ProductID INT FOREIGN KEY REFERENCES Products(ProductID), -- 商品
TransactionDate DATETIME DEFAULT GETDATE(), -- 交易日期
QuantityChange INT NOT NULL, -- 数量变化(正数为入库,负数为出库)
TransactionType NVARCHAR(20), -- 交易类型(如:Purchase进货、Sale销售、Adjustment调整)
ReferenceID INT, -- 关联单据ID(如进货单号、销售单号)
Notes NVARCHAR(255) -- 备注
);
GO
-- 插入一些示例数据(来源:个人项目常用测试数据)
-- 插入部门
INSERT INTO Departments (DepartmentName, Description) VALUES ('行政部', '负责行政事务');
INSERT INTO Departments (DepartmentName, Description) VALUES ('财务部', '负责财务管理');
INSERT INTO Departments (DepartmentName, Description) VALUES ('销售部', '负责商品销售');
INSERT INTO Departments (DepartmentName, Description) VALUES ('采购部', '负责商品采购');
-- 插入员工(先不指定经理,因为经理ID需要员工ID)
INSERT INTO Employees (EmployeeName, Gender, PhoneNumber, HireDate, Salary, DepartmentID) VALUES ('张三', '男', '13800138001', '2020-01-01', 8000, 1);
INSERT INTO Employees (EmployeeName, Gender, PhoneNumber, HireDate, Salary, DepartmentID) VALUES ('李四', '女', '13800138002', '2020-02-01', 7500, 3);
INSERT INTO Employees (EmployeeName, Gender, PhoneNumber, HireDate, Salary, DepartmentID) VALUES ('王五', '男', '13800138003', '2020-03-01', 7000, 4);
-- 更新部门经理(假设张三管行政部,李四管销售部)
UPDATE Departments SET ManagerID = 1 WHERE DepartmentID = 1;
UPDATE Departments SET ManagerID = 2 WHERE DepartmentID = 3;
-- 插入供应商
INSERT INTO Suppliers (SupplierName, ContactPerson, Phone, Address) VALUES ('XX食品有限公司', '赵经理', '400-100-1000', 'XX市工业区1号');
INSERT INTO Suppliers (SupplierName, ContactPerson, Phone, Address) VALUES ('YY饮料集团', '钱总', '400-200-2000', 'XX市开发区2号');
-- 插入商品类别
INSERT INTO Categories (CategoryName, ParentCategoryID) VALUES ('食品', NULL); -- 一级分类
INSERT INTO Categories (CategoryName, ParentCategoryID) VALUES ('饮料', NULL);
INSERT INTO Categories (CategoryName, ParentCategoryID) VALUES ('零食', 1); -- 二级分类,父类是“食品”
INSERT INTO Categories (CategoryName, ParentCategoryID) VALUES ('碳酸饮料', 2);
-- 插入商品
INSERT INTO Products (ProductName, CategoryID, SupplierID, UnitPrice, UnitInStock, ReorderLevel) VALUES ('薯片(原味)', 3, 1, 5.50, 100, 20);
INSERT INTO Products (ProductName, CategoryID, SupplierID, UnitPrice, UnitInStock, ReorderLevel) VALUES ('可乐(500ml)', 4, 2, 3.00, 200, 50);
-- 插入会员
INSERT INTO Members (MemberName, PhoneNumber, Points) VALUES ('顾客A', '13900139001', 150);
INSERT INTO Members (MemberName, PhoneNumber) VALUES ('顾客B', '13900139002');
-- 创建一个销售订单示例(来源:简易销售流程模拟)
-- 1. 创建订单头
INSERT INTO SalesOrders (MemberID, CashierID, PaymentMethod) VALUES (1, 2, '微信支付');
-- 假设上一条插入的OrderID是1
-- 2. 创建订单明细
INSERT INTO SalesOrderDetails (OrderID, ProductID, UnitPrice, Quantity) VALUES (1, 1, 5.50, 2); -- 买2包薯片
INSERT INTO SalesOrderDetails (OrderID, ProductID, UnitPrice, Quantity) VALUES (1, 2, 3.00, 1); -- 买1瓶可乐
-- 3. 更新订单总金额(可以通过触发器自动完成,这里手动更新演示)
UPDATE SalesOrders SET TotalAmount = (SELECT SUM(SubTotal) FROM SalesOrderDetails WHERE OrderID = 1) WHERE OrderID = 1;
-- 4. 更新库存(也可以通过触发器自动完成)
INSERT INTO InventoryTransactions (ProductID, QuantityChange, TransactionType, ReferenceID, Notes) VALUES (1, -2, 'Sale', 1, '销售出库');
INSERT INTO InventoryTransactions (ProductID, QuantityChange, TransactionType, ReferenceID, Notes) VALUES (2, -1, 'Sale', 1, '销售出库');
-- 5. 同步更新商品表的库存(可以通过触发器或存储过程实现)
UPDATE Products SET UnitInStock = UnitInStock - 2 WHERE ProductID = 1;
UPDATE Products SET UnitInStock = UnitInStock - 1 WHERE ProductID = 2;
-- 可以创建一些视图以便查询(来源:常见查询需求)
-- 查看商品完整信息(含类别和供应商名称)
CREATE VIEW V_ProductInfo AS
SELECT p.ProductID, p.ProductName, c.CategoryName, s.SupplierName, p.UnitPrice, p.UnitInStock
FROM Products p
LEFT JOIN Categories c ON p.CategoryID = c.CategoryID
LEFT JOIN Suppliers s ON p.SupplierID = s.SupplierID;
GO
-- 查看销售明细(含商品和订单信息)
CREATE VIEW V_SalesDetail AS
SELECT so.OrderID, so.OrderDate, m.MemberName, e.EmployeeName as CashierName, sod.ProductID, p.ProductName, sod.Quantity, sod.UnitPrice, sod.SubTotal
FROM SalesOrders so
LEFT JOIN Members m ON so.MemberID = m.MemberID
LEFT JOIN Employees e ON so.CashierID = e.EmployeeID
JOIN SalesOrderDetails sod ON so.OrderID = sod.OrderID
JOIN Products p ON sod.ProductID = p.ProductID;
GO
-- 使用视图查询
SELECT * FROM V_ProductInfo;
SELECT * FROM V_SalesDetail WHERE OrderID = 1;
(来源:GitHub上的开源项目说明)
这个脚本提供了一个起点,在实际应用中,你还需要考虑很多其他因素,
- 权限管理:创建不同的数据库用户和角色,控制他们对表的增删改查权限。
- 存储过程:将复杂的业务逻辑(如完整的销售流程、库存盘点)封装成存储过程,提高效率和安全性。
- 触发器:用于实现自动化的业务规则,例如在插入销售明细(SalesOrderDetails)后,自动更新商品库存(Products.UnitInStock)和记录库存变更(InventoryTransactions)。
- 索引:在经常用于查询条件的列(如ProductName, PhoneNumber, OrderDate)上创建索引,大幅提高查询速度。
- 数据备份与恢复策略:定期备份数据库,防止数据丢失。
直接使用此代码需要你具备基本的数据库知识,例如如何执行SQL脚本,建议先在测试环境中尝试,理解每一张表和每一个字段的作用,再根据你的商场具体业务流程进行修改和扩展。
本文由歧云亭于2026-01-03发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/73699.html
