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

742 阅读4分钟

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

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

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

1. 创建数据库

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

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

image.png

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

image.png

2. 创建数据库表

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

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

image.png

首先创造users表。

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

image.png

具体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语句是:

-- 注意,这里建表时有一定的顺序,因为涉及到一些表的外键(FK)的引用
-- 1. 用户表
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
);

-- 2. 产品表
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
);

-- 3. 客户表
CREATE TABLE customers (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  contact_number TEXT,
  email TEXT,
  address TEXT,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 4. 入库记录表
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
);

-- 5. 订单表
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'
);

-- 6. 订单明细表
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
);

-- 7. 配送记录表(可选)
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 下面找到刚刚创建的表单。

image.png

========

以下为补充内容

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

users(系统用户):

字段名类型描述
idSERIAL (PK)用户 ID,自增主键
usernameTEXT登录名(唯一)
password_hashTEXT加密后的密码
full_nameTEXT用户姓名
roleTEXT角色:如 'admin'、'staff'、'warehouse'
created_atTIMESTAMP创建时间

products(商品信息):

字段名类型描述
idSERIAL (PK)产品 ID,自增主键
nameTEXT产品名称(如 角铝、圆管 等)
specificationTEXT规格(如 20x20mm、2mm 厚)
unitTEXT单位(如 米、条、根)
priceNUMERIC(10, 2)单价(如 12.50)
stock_quantityINTEGER当前库存数量
created_atTIMESTAMP添加时间

inbound_shipments(入库记录):

字段名类型描述
idSERIAL (PK)入库记录 ID
product_idINTEGER (FK → products.id)入库的产品
quantityINTEGER入库数量
shipment_codeTEXT货柜编号或批次号(可选)
arrival_dateDATE到货日期
created_byINTEGER (FK → users.id)哪个用户录入的
created_atTIMESTAMP入库登记时间

customers(客户信息):

字段名类型描述
idSERIAL (PK)客户 ID
nameTEXT客户名称(公司名或个人名)
contact_numberTEXT电话号码
emailTEXT邮箱(可选)
addressTEXT地址
created_atTIMESTAMP添加时间

orders(客户订单):

字段名类型描述
idSERIAL (PK)订单 ID
customer_idINTEGER (FK → customers.id)所属客户
order_dateTIMESTAMP下单时间
created_byINTEGER (FK → users.id)哪位员工录入的
is_deliveryBOOLEAN是否需要配送
statusTEXT状态(如:pending, fulfilled, canceled)

order_items(订单中的商品):

字段名类型描述
idSERIAL (PK)明细 ID
order_idINTEGER (FK → orders.id)所属订单
product_idINTEGER (FK → products.id)产品
quantityINTEGER数量
unit_priceNUMERIC(10, 2)下单时的单价(防止价格变动影响历史)

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

字段名类型描述
idSERIAL (PK)配送记录 ID
order_idINTEGER (FK → orders.id)对应的订单
delivery_dateDATE配送日期
delivered_byINTEGER (FK → users.id)配送人员
is_deliveredBOOLEAN是否已送达
notesTEXT配送备注(可选)

各个表的一对多关系:

主表子表关系类型
customersorders1 → ∞
ordersorder_items1 → ∞
productsorder_items1 → ∞
productsinbound_shipments1 → ∞
usersorders, inbound_shipments, delivery1 → ∞
ordersdelivery1 → 1(可选)

========

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