Php 处理身份困境
关于状态字段和类似的预定义值集,经常会出现问题 让我们以一个订单系统为例,该订单实体的状态可以是新的、进行中的、已支付的等等 问题是: 订单的状态需要为Php 处理身份困境,php,node.js,database,api,web-services,Php,Node.js,Database,Api,Web Services,关于状态字段和类似的预定义值集,经常会出现问题 让我们以一个订单系统为例,该订单实体的状态可以是新的、进行中的、已支付的等等 问题是: 订单的状态需要为 存储(在数据库中) 已处理(在后端) 通信(在web服务API中传输到前端) 如何在保持以下状态的同时进行这三项活动: 保留状态的含义 高效存储 以下是一些示例实现及其优缺点: 1-状态表 数据库将包含一个id为name的状态表 订单表引用状态的id CREATE TABLE `status` ( `id` INT NOT NUL
- 存储(在数据库中)
- 已处理(在后端)
- 通信(在web服务API中传输到前端)
- 保留状态的含义
- 高效存储
- 数据库将包含一个id为name的状态表
- 订单表引用状态的id
CREATE TABLE `status` ( `id` INT NOT NULL, `name` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)); CREATE TABLE IF NOT EXISTS `order` ( `id` INT NOT NULL AUTOINCREMENT, `status_id` INT NOT NULL, PRIMARY KEY (`id`), INDEX `order_status_idx` (`status` ASC), CONSTRAINT `order_status_id` FOREIGN KEY (`status_id`) REFERENCES `status` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION);
- 后端代码有一个枚举,该枚举在代码中赋予这些预定义整数一个含义
enum Status { PAID = 7; }; // While processing as action ... order.status = Status::PAID;
- web服务API将返回状态号
order: { id: 1, status_id: 7 }
- 前端代码有一个类似的枚举,它在代码中赋予这些预定义整数一个含义。(与后端代码类似)
- 优点:
- 数据库定义良好并规范化
- 缺点:
- 状态编号和含义之间的映射在三个位置完成,这为定义特定状态编号含义时的人为错误和不一致性提供了空间
- API返回的数据不是描述性的,因为
没有提供具体的含义,因为它不包括status\u id:7
status\u id:7
- 在数据库中,订单表将包含一个包含预定义状态的ENUM类型的状态列
CREATE TABLE IF NOT EXISTS `order` ( `id` INT NOT NULL AUTOINCREMENT, `status` ENUM('PAID') NULL, PRIMARY KEY (`id`));
- 后端代码具有常量值作为预定义状态的代码工件
enum Status { PAID = 'PAID' };
或 用作下列用途enum Status { PAID = 'PAID' };
// While processing as action ... order.status = Status::PAID;
// While processing as action ... order.status = Status::PAID;
- web服务API将返回状态常量
order: { id: 1, status: 'PAID' }
order: { id: 1, status: 'PAID' }
- 对于预定义的状态常量,前端代码将具有类似的构造。(与后端代码类似)
- 优点:
- 数据库定义良好并规范化
- API返回的数据是描述性的,并提供所需的含义
- 使用的状态常数已经包含了它们的含义,这减少了出错的机会
- 缺点:
- 对数据库中的列使用枚举类型有其局限性。稍后使用ALTER命令向该枚举添加新的状态常量非常昂贵,特别是对于像
table这样的大型表order
- 对数据库中的列使用枚举类型有其局限性。稍后使用ALTER命令向该枚举添加新的状态常量非常昂贵,特别是对于像
- 数据库将包含一个状态表,其中一个字段名为
,类型为string,是该表的主键key
CREATE TABLE `status` ( `key` VARCHAR(45) NOT NULL, PRIMARY KEY (`key`));
- 订单表将包含一个名为
的字段,其类型字符串引用status
表的status
字段键
CREATE TABLE IF NOT EXISTS `order` ( `id` INT NOT NULL AUTOINCREMENT, `status` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`), INDEX `order_status_idx` (`status` ASC), CONSTRAINT `order_status` FOREIGN KEY (`status`) REFERENCES `status` (`key`) ON DELETE NO ACTION ON UPDATE NO ACTION);
- 后端代码具有常量值作为预定义状态的代码工件
enum Status { PAID = 'PAID' };
或 用作下列用途enum Status { PAID = 'PAID' };
// While processing as action ... order.status = Status::PAID;
// While processing as action ... order.status = Status::PAID;
- web服务API将返回状态常量
order: { id: 1, status: 'PAID' }
order: { id: 1, status: 'PAID' }
- 对于预定义的状态常量,前端代码将具有类似的构造。(与后端代码类似)
- 优点:
- 数据库定义良好并规范化
- API返回的数据是描述性的,并提供所需的含义
- 使用的状态常数已经包含了它们的含义,这减少了出错的机会
- 使用状态表中的INSERT命令添加新的状态常量非常简单
- 缺点:
谢谢。这是我解决这个问题的方法:
orders
表中添加了一个类型为string
的列status
const PAID=2
value
和name
第1个和我的解决方案也是一样。很好,但DB将允许任何处于
状态的字符串
,并且DB既没有关于pos的信息也没有约束