Mee*_*ons 20 php database api web-services node.js
关于状态字段和类似的预定义值集存在重复出现的问题.
让我们举一个订单系统的例子,订单实体的状态可以是New,In Progress,Paid等.
订单的状态需要
如何保持这三项活动:
以下是一些具有优缺点的示例实现:
订单表引用状态的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);
Run Code Online (Sandbox Code Playgroud)后端代码有一个枚举,它为代码中的这些预定义整数赋予了意义
enum Status {
PAID = 7;
};
// While processing as action ...
order.status = Status::PAID;
Run Code Online (Sandbox Code Playgroud)Web服务API将返回状态编号
order: { id: 1, status_id: 7 }
Run Code Online (Sandbox Code Playgroud)前端代码具有类似的枚举,它为代码中的这些预定义整数赋予了含义.(比如后端代码)
优点:
status_id: 7它没有提供具体含义,因为它不包含的含义status_id: 7在数据库中,订单表将包含状态列,其类型为ENUM,包含预定义的状态.
CREATE TABLE IF NOT EXISTS `order` (
`id` INT NOT NULL AUTOINCREMENT,
`status` ENUM('PAID') NULL,
PRIMARY KEY (`id`));
Run Code Online (Sandbox Code Playgroud)后端代码具有常量值作为预定义状态的代码工件
enum Status {
PAID = 'PAID'
};
Run Code Online (Sandbox Code Playgroud)
要么
class Status {
public:
static const string PAID = PAID;
};
Run Code Online (Sandbox Code Playgroud)
用作以下内容
// While processing as action ...
order.status = Status::PAID;
Run Code Online (Sandbox Code Playgroud)Web服务API将返回状态常量
order: { id: 1, status: 'PAID' }
Run Code Online (Sandbox Code Playgroud)前端代码将具有用于预定义状态常量的类似构造.(比如后端代码)
优点:
order表这样的大表来说是特别昂贵的.数据库将包含一个状态表,其中一个字段key使用类型字符串调用,该字符串是此表的主键.
CREATE TABLE `status` (
`key` VARCHAR(45) NOT NULL,
PRIMARY KEY (`key`));
Run Code Online (Sandbox Code Playgroud)订单表将包含一个名为statustype string的key字段,该字段引用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);
Run Code Online (Sandbox Code Playgroud)后端代码具有常量值作为预定义状态的代码工件
enum Status {
PAID = 'PAID'
};
Run Code Online (Sandbox Code Playgroud)
要么
class Status {
public:
static const string PAID = PAID;
};
Run Code Online (Sandbox Code Playgroud)
用作以下内容
// While processing as action ...
order.status = Status::PAID;
Run Code Online (Sandbox Code Playgroud)Web服务API将返回状态常量
order: { id: 1, status: 'PAID' }
Run Code Online (Sandbox Code Playgroud)前端代码将具有用于预定义状态常量的类似构造.(比如后端代码)
优点:
谢谢.
这是我解决这个问题的方法:
status带有类型的列。stringorders这使得只需编辑代码库即可轻松添加新状态,并且状态的检索值仍然是字符串(描述性)。
我希望这能回答你的问题。
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |