>我有一个带有一列的"用户"表:
USERNAME varchar(40)
"用户"可以是管理用户,也可以是标准用户。 管理用户始终包含纯数字用户名。
然后,我可以使用正则表达式提取所有具有数字名称的用户以获取管理用户,反之亦然以获取非管理用户。
是否可以在我的选择查询中使用正则表达式来获取此信息,或者我应该添加一个额外的列:
MANAGEMENT TINYINT(1)
存储用户是否为管理用户。
什么是最佳实践,为什么?
领域里依赖这种"隐藏"的含义,真的不是很安全或有效。添加新字段。真。没有合理的理由不这样做。
我还建议阅读这篇关于Falsehoods Programmers Believe About Names的文章。
一些例子:
9:人名用ASCII书写。
15:人名不包含数字。
24:我的系统永远不必处理来自中国的名字。
25:或者日本。
26:或者韩国。
您的正则表达式可以处理所有这些吗?确实?每次?
通常最好将架构设计为规范化。 这包括没有多个将存储相同信息的列。 但是,用户名和成为管理用户绝对是分散的信息,您需要两者。
您可以将BIT
类型用于新列。
如果要强制实施特定格式的用户名,标准数据库解决方案是定义检查约束,如下所示:
ALTER TABLE YourTable ADD CONSTRAINT YourConstraint CHECK ( is_management_user = 0 OR ...)
(其中...
将包括 Oracle 上的 REGEXP_LIKE
,转换为 TSQL 中的整数或类似的东西)。
但是,MySql 不强制执行检查约束,如果您认为USERNAME
的形式对应用程序的安全性或操作很重要,则必须使用触发器模拟它们 - 我希望,它真的不是。