成功和失败的列名
Column name for success and failure
我有一个 table request_track
可以保存各种与安全相关的请求。
必须分别保存不成功和成功的登录,并将 request_track
table 中的条目标记为此类。现在我正在努力寻找一个好名字(#2)并且想知道你们会在我的地方做什么。
我考虑了以下选项:
选项 1
设置两个 TINYINT
列:is_login_success
和 is_login_failure
默认 0
。
优点
- 很清楚
- 方便以后检索数据时使用。为了比较失败和成功,我可以简单地使用
sum(is_login_success)
和 sum(is_login_failure)
缺点
- 在逻辑中,只有两者之一将设置为
1
或两者都设置为 0
。虽然在技术上可以同时设置 1
这会导致代码中出现不可预测的 table 问题。
- 2 列,而只有一列可用于产生类似的效果
选项 2
类似一个 is_login_success
TINYINT
默认值 null
.
1
表示这是一个成功的登录请求,0
表示请求不成功,null
表示两者都不是。
优点
- 只需要一栏
缺点
- 完全不清楚
0
明确表示它是失败的。
- 要检索数据以比较所有成功和失败,需要两个查询
选项 3
我可以做一个 is_login
ENUM('success', 'failure')
默认值 null
优点
- 很清楚
- 只有一栏
缺点
- 要检索数据以比较所有成功和失败,需要两个查询(或者有没有办法将失败和成功以及 return 都与枚举相加?)。
我最喜欢的显然是#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
无论如何,你的方法应该考虑
维护数据有多容易?
正如您所指出的,第一个选项可能会使无效数据进入您的
table。如果一行在 is_login_success
和 is_login_failure
中都以 1
结尾
那么你丢失了数据。
第二个选项也有丢失数据的可能。如果查询将 2
插入 is_login_success
会怎样?没有约束,数据库不会介意,但该行将没有任何业务意义。
第三个选项可以防止这两个错误。只有一列,因此给定的行不能处于冲突状态。该列具有预先确定的可能值数量,因此它不能处于无效状态。
维护table有多容易?
向每一行添加一个列并不复杂,但是您提到此 table 将用于跟踪不同类型的请求。每种类型都需要一个新的 is_<request type>
列吗?您的 table 有可能很快变宽。
您可以考虑将每一行缩减为标识符、类型和状态。允许状态的含义在类型之间有所不同,并且可以在外部 table 中定义。当您需要添加或删除类型时,您是在添加或删除外部 table,而不是在 table.
上添加或删除列
我有一个 table request_track
可以保存各种与安全相关的请求。
必须分别保存不成功和成功的登录,并将 request_track
table 中的条目标记为此类。现在我正在努力寻找一个好名字(#2)并且想知道你们会在我的地方做什么。
我考虑了以下选项:
选项 1
设置两个 TINYINT
列:is_login_success
和 is_login_failure
默认 0
。
优点
- 很清楚
- 方便以后检索数据时使用。为了比较失败和成功,我可以简单地使用
sum(is_login_success)
和sum(is_login_failure)
缺点
- 在逻辑中,只有两者之一将设置为
1
或两者都设置为0
。虽然在技术上可以同时设置1
这会导致代码中出现不可预测的 table 问题。 - 2 列,而只有一列可用于产生类似的效果
选项 2
类似一个 is_login_success
TINYINT
默认值 null
.
1
表示这是一个成功的登录请求,0
表示请求不成功,null
表示两者都不是。
优点
- 只需要一栏
缺点
- 完全不清楚
0
明确表示它是失败的。 - 要检索数据以比较所有成功和失败,需要两个查询
选项 3
我可以做一个 is_login
ENUM('success', 'failure')
默认值 null
优点
- 很清楚
- 只有一栏
缺点
- 要检索数据以比较所有成功和失败,需要两个查询(或者有没有办法将失败和成功以及 return 都与枚举相加?)。
我最喜欢的显然是#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
无论如何,你的方法应该考虑
维护数据有多容易?
正如您所指出的,第一个选项可能会使无效数据进入您的 table。如果一行在
is_login_success
和is_login_failure
中都以1
结尾 那么你丢失了数据。第二个选项也有丢失数据的可能。如果查询将
2
插入is_login_success
会怎样?没有约束,数据库不会介意,但该行将没有任何业务意义。第三个选项可以防止这两个错误。只有一列,因此给定的行不能处于冲突状态。该列具有预先确定的可能值数量,因此它不能处于无效状态。
维护table有多容易?
向每一行添加一个列并不复杂,但是您提到此 table 将用于跟踪不同类型的请求。每种类型都需要一个新的
is_<request type>
列吗?您的 table 有可能很快变宽。您可以考虑将每一行缩减为标识符、类型和状态。允许状态的含义在类型之间有所不同,并且可以在外部 table 中定义。当您需要添加或删除类型时,您是在添加或删除外部 table,而不是在 table.
上添加或删除列