
在 sql 中无法直接为字段存储“列表”,而应通过外键建立一对多关系:将 list 所对应的子类(如 orderitem)独立建表,并在子表中添加指向父表(如 order)的外键。
在关系型数据库设计中,Java 实体类中的 List
✅ 正确设计原则:
- 每个 Java 类对应一张独立的数据表;
- List
表示“一个父记录关联多个子记录”,即 父表(1)→ 子表(N); - 子表中必须包含一个外键字段(如 id_order),引用父表主键,从而建立关联;
- 父表中不保存任何关于子表的字段或集合信息——这是初学者常见误区。
以下是基于你提供的 Java 类结构的完整、可执行的 SQL 建表脚本(以 MySQL 语法为例,已修正原始脚本中的语法错误):
-- 产品表(Product)
CREATE TABLE product (
id INT AUTO_INCREMENT PRIMARY KEY,
description VARCHAR(255) NOT NULL,
value NUMERIC(10,2) NOT NULL
);
-- 人员表(Person)——注意:原始代码中引用了 person(id),需先创建
CREATE TABLE person (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(150)
);
-- 订单表(Order)——不含 "itens" 列!只保留自身属性及关联 person 的外键
CREATE TABLE `order` ( -- 使用反引号避免关键字冲突(order 是 SQL 保留字)
id BIGINT AUTO_INCREMENT PRIMARY KEY,
id_person INT NOT NULL,
FOREIGN KEY (id_person) REFERENCES person(id) ON DELETE CASCADE
);
-- 订单项表(OrderItem)——真正承载“List”语义的子表
CREATE TABLE order_item (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
id_product INT NOT NULL,
quantity INT NOT NULL CHECK (quantity > 0),
id_order BIGINT NOT NULL,
FOREIGN KEY (id_product) REFERENCES product(id) ON DELETE RESTRICT,
FOREIGN KEY (id_order) REFERENCES `order`(id) ON DELETE CASCADE
); ⚠️ 关键注意事项:
立即学习“Java免费学习笔记(深入)”;
- 命名规范:建议避免使用 SQL 保留字(如 order, person)作为表名;若必须使用,请用反引号包裹(如 `order`)。
- 数据类型修正:order.id 在 Java 中是 Long,对应 SQL 应为 BIGINT(而非 INT);同理 orderItem.id 也应为 BIGINT。
- 外键约束:务必显式声明 FOREIGN KEY (...) REFERENCES ...,并合理设置 ON DELETE 行为(如 CASCADE 自动清理子记录,或 RESTRICT 防止误删)。
- 索引优化:生产环境中,应在外键列(如 order_item.id_order, order_item.id_product)上建立索引,以加速 JOIN 查询。
- 不要用 JSON/TEXT 存 List:虽然 MySQL 支持 JSON 类型,但会丧失关系完整性、无法高效关联查询、难以做事务一致性校验——这违背了 ORM 映射和数据库设计的基本原则。
总结:Java 中的 List










