0

我有一个带有列的“用户”表:

USERNAME varchar(40)

“用户”可以是管理用户,也可以是标准用户。管理用户始终包含纯数字用户名。

然后我可以使用正则表达式提取所有具有数字名称的用户以获取管理用户,反之亦然以获取非管理用户。

因此,在我的选择查询中使用正则表达式来获取此信息是否可行,或者我应该添加一个额外的列:

MANAGEMENT TINYINT(1)

其中存储用户是否为管理用户。

什么是最佳实践,为什么?

4

2 回答 2

3

在一个字段中依赖这种“隐藏”的含义确实不是很安全或有效。添加一个新字段。真的。没有合理的理由不这样做

我还建议阅读这篇关于Falsehoods Programmers Believe About Names的文章。

一些例子:

9:人名用ASCII写。

15:人名不包含数字。

24:我的系统永远不需要处理来自中国的名字。

25:或者日本

26:或者韩国

您的正则表达式可以处理所有这些吗?当然?每次?

于 2012-06-27T10:51:02.113 回答
2

通常最好将模式设计为​​规范化。这包括没有多个列可以存储相同的信息。但是,用户名和作为管理用户绝对是不同的信息,您需要两者。

您可以使用BIT新列的类型。

如果您想强制使用特定格式的用户名,标准的数据库解决方案将定义一个检查约束,如下所示:

ALTER TABLE YourTable ADD CONSTRAINT YourConstraint CHECK ( is_management_user = 0 OR ...)

(其中...将包括REGEXP_LIKE在 Oracle 上,在 TSQL 中转换为整数或类似的东西)。

但是,MySql不强制检查约束,如果您认为USERNAME某种形式对应用程序的安全或操作很重要,则必须使用触发器来模拟它们 - 我希望它确实不是。

于 2012-06-27T10:41:50.730 回答