企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

从零开始一个完整的全栈项目(2) - 创建数据库表

wudianyun 2025-07-23 18:53:56 精选文章 4 ℃

有 ER 图的情况下,创建数据库会相对简单一些。

这个项目使用的是 Postgresql 这个数据库,下载地址是:
www.postgresql.org/download/ma… ,使用的是推荐的 installer 安装的。

数据库管理软件使用的是下载包里面自带的 pgAdmin4 .

1. 创建数据库

打开 pgAdmin。(如果安装成功,第一次使用会要求输入你设置的密码)

在左侧的 Databases 上右键->Create->Database.

在 database 这里输入你想要的数据库的名字,其他保持默认就好。保存。

#技术分享 #掘金2. 创建数据库表

当你完成了创建以后,左侧就会出现已经建立好的数据库。

右键点击你刚刚创建的数据库,选择 Query Tool,进入 SQL 编辑窗口。我们将在这里编辑建表语句。

首先创造 users 表。

在 SQL 编辑器中如下图所示:

具体 SQL 语句如下:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username TEXT UNIQUE NOT NULL,
  password_hash TEXT NOT NULL,
  full_name TEXT,
  role TEXT CHECK (role IN ('admin', 'staff', 'warehouse')),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

点击上方 运行图标(execute 按钮) 运行。运行成功下方会有提示。

同理,其他几张表的 SQL 语句是:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username TEXT UNIQUE NOT NULL,
  password_hash TEXT NOT NULL,
  full_name TEXT,
  role TEXT CHECK (role IN ('admin', 'staff', 'warehouse')),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE products ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, specification TEXT, unit TEXT, price NUMERIC(10, 2), stock_quantity INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

CREATE TABLE customers ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, contact_number TEXT, email TEXT, address TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

CREATE TABLE inbound_shipments ( id SERIAL PRIMARY KEY, product_id INTEGER REFERENCES products(id), quantity INTEGER NOT NULL, shipment_code TEXT, arrival_date DATE, created_by INTEGER REFERENCES users(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

CREATE TABLE orders ( id SERIAL PRIMARY KEY, customer_id INTEGER REFERENCES customers(id), order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_by INTEGER REFERENCES users(id), is_delivery BOOLEAN DEFAULT FALSE, status TEXT CHECK (status IN ('pending', 'fulfilled', 'canceled')) DEFAULT 'pending' );

CREATE TABLE order_items ( id SERIAL PRIMARY KEY, order_id INTEGER REFERENCES orders(id), product_id INTEGER REFERENCES products(id), quantity INTEGER NOT NULL, unit_price NUMERIC(10, 2) NOT NULL );

CREATE TABLE delivery ( id SERIAL PRIMARY KEY, order_id INTEGER UNIQUE REFERENCES orders(id), delivery_date DATE, delivered_by INTEGER REFERENCES users(id), is_delivered BOOLEAN DEFAULT FALSE, notes TEXT );

3. 创建完成

创建完成后,可以在左侧 Schemas->public->Tables 下面找到刚刚创建的表单。

========

以下为补充内容

这几张表的字段以及各字段的含义如下:

users(系统用户):

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 用户 ID,自增主键 | | username | TEXT | 登录名(唯一) | | password_hash | TEXT | 加密后的密码 | | full_name | TEXT | 用户姓名 | | role | TEXT | 角色:如 'admin'、'staff'、'warehouse' | | created_at | TIMESTAMP | 创建时间 |

products(商品信息):

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 产品 ID,自增主键 | | name | TEXT | 产品名称(如 角铝、圆管 等) | | specification | TEXT | 规格(如 20x20mm、2mm 厚) | | unit | TEXT | 单位(如 米、条、根) | | price | NUMERIC(10, 2) | 单价(如 12.50) | | stock_quantity | INTEGER | 当前库存数量 | | created_at | TIMESTAMP | 添加时间 |

inbound_shipments(入库记录):

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 入库记录 ID | | product_id | INTEGER (FK → products.id) | 入库的产品 | | quantity | INTEGER | 入库数量 | | shipment_code | TEXT | 货柜编号或批次号(可选) | | arrival_date | DATE | 到货日期 | | created_by | INTEGER (FK → users.id) | 哪个用户录入的 | | created_at | TIMESTAMP | 入库登记时间 |

customers(客户信息):

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 客户 ID | | name | TEXT | 客户名称(公司名或个人名) | | contact_number | TEXT | 电话号码 | | email | TEXT | 邮箱(可选) | | address | TEXT | 地址 | | created_at | TIMESTAMP | 添加时间 |

orders(客户订单):

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 订单 ID | | customer_id | INTEGER (FK → customers.id) | 所属客户 | | order_date | TIMESTAMP | 下单时间 | | created_by | INTEGER (FK → users.id) | 哪位员工录入的 | | is_delivery | BOOLEAN | 是否需要配送 | | status | TEXT | 状态(如:pending, fulfilled, canceled) |

order_items(订单中的商品):

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 明细 ID | | order_id | INTEGER (FK → orders.id) | 所属订单 | | product_id | INTEGER (FK → products.id) | 产品 | | quantity | INTEGER | 数量 | | unit_price | NUMERIC(10, 2) | 下单时的单价(防止价格变动影响历史) |

delivery(配送信息,可选):有些客户选择过来自提(pick up)货物(铝制建筑材料),有些客户选择付款让仓库人员配送。

| 字段名 | 类型 | 描述 | | ---

| id | SERIAL (PK) | 配送记录 ID | | order_id | INTEGER (FK → orders.id) | 对应的订单 | | delivery_date | DATE | 配送日期 | | delivered_by | INTEGER (FK → users.id) | 配送人员 | | is_delivered | BOOLEAN | 是否已送达 | | notes | TEXT | 配送备注(可选) |

各个表的一对多关系:

| 主表 | 子表 | 关系类型 | | ---

| customers → orders | 1 → ∞ | | | orders → order_items | 1 → ∞ | | | products → order_items | 1 → ∞ | | | products → inbound_shipments | 1 → ∞ | | | users → orders, inbound_shipments, delivery | 1 → ∞ | | | orders → delivery | 1 → 1(可选) | |

========

下一篇内容:手动往数据库里面添加一些测试数据。

最近发表
标签列表