成功和失败的列名

Column name for success and failure

我有一个 table request_track 可以保存各种与安全相关的请求。

必须分别保存不成功和成功的登录,并将 request_track table 中的条目标记为此类。现在我正在努力寻找一个好名字(#2)并且想知道你们会在我的地方做什么。

我考虑了以下选项:

选项 1

设置两个 TINYINT 列:is_login_successis_login_failure 默认 0
优点

缺点

选项 2

类似一个 is_login_success TINYINT 默认值 null.
1 表示这是一个成功的登录请求,0 表示请求不成功,null 表示两者都不是。 优点

缺点

选项 3

我可以做一个 is_login ENUM('success', 'failure') 默认值 null
优点

缺点

我最喜欢的显然是#3,但我不想使用两个 SELECT 查询。我敢肯定,尽管只有一个是可能的。我应该多注意 class.

我最终找到了针对选项 3 () 缺点的解决方案。
is_login 列:

`is_login` ENUM('success','failure') NULL DEFAULT NULL

检索成功和失败数量的查询:

SELECT 
SUM(case when rt.is_login like 'success' then 1 else 0 END) login_success,
SUM(case when rt.is_login like 'failure' then 1 else 0 END) login_failure
FROM request_track rt;

对于这些情况中的任何一种,您都不需要两次查询来获取 successes/failures 的数量。


选项 1

对每列使用一次 SUM 函数。

CREATE TABLE request_track (
  request_id INT NOT NULL AUTO_INCREMENT,
  is_login_success TINYINT NOT NULL,
  is_login_failure TINYINT NOT NULL,
  PRIMARY KEY ( request_id )
);
SELECT SUM( is_login_success ) AS num_success,
  SUM( is_login_failure ) AS num_failure
FROM request_track;
num_success num_failure
13 2

选项 2

对每个可能的值使用一次 SUM 函数。使用 CASE 函数确定用于每一行的值。

CREATE TABLE request_track (
  request_id INT NOT NULL AUTO_INCREMENT,
  is_login_success TINYINT,
  PRIMARY KEY ( request_id )
);
SELECT SUM(CASE WHEN is_login_success = 1 THEN 1 ELSE 0 END) AS num_success,
  SUM(CASE WHEN is_login_success = 0 THEN 1 ELSE 0 END) AS num_failure,
  SUM(CASE WHEN is_login_success IS NULL THEN 1 ELSE 0 END) AS num_unknown
FROM request_track;
num_success num_failure num_unknown
13 2 3

选项 3

与选项 2 相同的方法。

CREATE TABLE request_track (
  request_id INT NOT NULL AUTO_INCREMENT,
  is_login ENUM('success', 'failure') DEFAULT NULL,
  PRIMARY KEY ( request_id )
);
SELECT SUM(CASE WHEN is_login = 'success' THEN 1 ELSE 0 END) AS num_success,
  SUM(CASE WHEN is_login = 'failure' THEN 1 ELSE 0 END) AS num_failure,
  SUM(CASE WHEN is_login IS NULL THEN 1 ELSE 0 END) AS num_unknown
FROM request_track;
num_success num_failure num_unknown
13 2 3

无论如何,你的方法应该考虑

  1. 维护数据有多容易?

    正如您所指出的,第一个选项可能会使无效数据进入您的 table。如果一行在 is_login_successis_login_failure 中都以 1 结尾 那么你丢失了数据。

    第二个选项也有丢失数据的可能。如果查询将 2 插入 is_login_success 会怎样?没有约束,数据库不会介意,但该行将没有任何业务意义。

    第三个选项可以防止这两个错误。只有一列,因此给定的行不能处于冲突状态。该列具有预先确定的可能值数量,因此它不能处于无效状态。

  2. 维护table有多容易?

    向每一行添加一个列并不复杂,但是您提到此 table 将用于跟踪不同类型的请求。每种类型都需要一个新的 is_<request type> 列吗?您的 table 有可能很快变宽。

    您可以考虑将每一行缩减为标识符、类型和状态。允许状态的含义在类型之间有所不同,并且可以在外部 table 中定义。当您需要添加或删除类型时,您是在添加或删除外部 table,而不是在 table.

    上添加或删除列