关于状态字段和类似的预定义值集存在一个反复出现的问题。
让我们举一个订单系统的例子,订单实体的状态可以是新的,正在进行的,付费的等等。
订单的状态需要
如何保持这三项活动:
以下是一些具有优缺点的示例实现:
订单表引用状态的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 }
前端代码具有类似的枚举,使代码中的这些预定义整数具有意义。 (如后端代码)
优点:
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`));
后端代码具有常量值,作为预定义状态的代码工件
enum Status {
PAID = 'PAID'
};
OR
class Status {
public:
static const string PAID = PAID;
};
用作以下内容
// While processing as action ...
order.status = Status::PAID;
Web服务API将返回状态常量
order: { id: 1, status: 'PAID' }
前端代码将具有预定义状态常量的类似构造。 (如后端代码)
优点:
order
表这样的大表来说是特别昂贵的。数据库将包含一个状态表,其中一个字段名为key
,其字符串类型为此表的主键。
CREATE TABLE `status` (
`key` VARCHAR(45) NOT NULL,
PRIMARY KEY (`key`));
订单表将包含一个名为status
的字段,其字符串类型引用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);
后端代码具有常量值,作为预定义状态的代码工件
enum Status {
PAID = 'PAID'
};
OR
class Status {
public:
static const string PAID = PAID;
};
用作以下内容
// While processing as action ...
order.status = Status::PAID;
Web服务API将返回状态常量
order: { id: 1, status: 'PAID' }
前端代码将具有预定义状态常量的类似构造。 (如后端代码)
优点:
谢谢。
答案 0 :(得分:0)
这是我解决这个问题的方法:
status
表格中添加了string
列{。}}。这样只需编辑代码库就可以非常轻松地添加新状态,并且检索到的状态值仍然是一个字符串(描述性)。
我希望这能回答你的问题。
答案 1 :(得分:0)
我建议这样做:
const PAID = 2
value
和name
之类的一些方法。人为错误的空间
为避免人为错误而发明的测试。
状态通常不是那么复杂,也没有太多的值可弄乱它们。
枚举是邪恶的。 http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
关于您的建议:
数据库定义良好并规范化
不。它是非规范化的。
API返回的数据具有描述性,并具有所需的含义。
您始终可以使用包装器,该包装器会进入状态表以获取人名。
所使用的状态常量已经包含了其含义,从而减少了出错的机会。
const名称是人类的名字,值是Benders的东西。
使用状态表中的INSERT命令添加新的状态常数很简单。
与第一和我的解决方案相同。