进销存系统入门:数据库基础与表结构初步设计
进销存系统入门:数据库基础与表结构初步设计
这一篇不是教你“什么是数据库 101”,
而是 站在“我马上要写 C# 程序”的角度,思考数据库该怎么设计。
一、为什么在写 C# 之前,必须先把数据库想清楚?
如果你有 Java + JDBC 经验,一定踩过这些坑:
- 表结构随便建,后面发现字段不够
- 表之间关系不清,SQL 越写越复杂
- 程序逻辑写了一半,发现数据根本存不下
数据库不是“存数据的地方”
数据库是整个系统的“地基”
进销存系统的本质其实只有一句话:
谁的什么商品,在什么地方,有多少。
二、进销存系统最小数据模型(MVP)
我们先不做“企业级 ERP”,只做一个能跑起来的系统。
最核心的 3 类数据
| 数据类型 | 说明 |
|---|---|
| 商品 | 我卖/管的是什么 |
| 库存 | 商品现在还剩多少 |
| 出入库记录 | 库存为什么变化 |
本篇先做 前两张表
出入库记录留给下一篇
三、商品表(Product)设计
商品表需要存什么?
从业务角度拆:
- 商品唯一标识
- 商品名称
- 商品价格
- 商品单位
- 商品状态
商品表 SQL 设计
CREATE TABLE product (
id INT PRIMARY KEY IDENTITY(1,1),
product_code VARCHAR(50) NOT NULL UNIQUE,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
unit VARCHAR(20),
status INT DEFAULT 1,
create_time DATETIME DEFAULT GETDATE()
);
字段解释(非常重要)
| 字段 | 说明 |
|---|---|
| id | 主键,程序内部使用 |
| product_code | 商品编码,业务唯一 |
| product_name | 商品名称 |
| price | 单价 |
| unit | 单位(件 / 箱 / 个) |
| status | 1=正常,0=下架 |
| create_time | 创建时间 |
⚠️ 不要把商品名当主键
⚠️ 业务字段和技术主键要分开
四、库存表(Stock)设计
库存表解决什么问题?
库存不是商品本身,而是:
某个商品,在某个地方,还剩多少
库存表 SQL
CREATE TABLE stock (
id INT PRIMARY KEY IDENTITY(1,1),
product_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 0,
update_time DATETIME DEFAULT GETDATE()
);
表关系说明
stock.product_id→product.id- 一个商品 → 一条库存记录(先简化)
如果你想更专业,可以加外键:
ALTER TABLE stock
ADD CONSTRAINT fk_stock_product
FOREIGN KEY (product_id) REFERENCES product(id);
五、为什么不直接把库存字段放在商品表?
很多新手会这么写:
quantity INT
❌ 这是一个设计陷阱
原因:
- 商品是“静态信息”
- 库存是“动态状态”
- 后期一定会有:
- 多仓库
- 冻结库存
- 批次库存
商品 ≠ 库存
六、站在程序员角度理解“数据存哪里”
你未来在 C# 里做的事情其实只有三类:
- 查商品
- 改库存
- 记录变化原因
数据库提前拆清楚:
| 行为 | 表 |
|---|---|
| 查商品列表 | product |
| 显示库存 | stock |
| 入库 / 出库 | 出入库表(下一篇) |

浙公网安备 33010602011771号