假设我有一个关系数据库,除其他外,我想在其中存储员工姓名及其标识字符串。标识字符串的格式是严格定义的:它是三个大写字母字符,后跟一个破折号,后跟一个四位数字。
问题:任何关系数据库是否允许定义特定文本字段必须符合的正则表达式?就像在我的示例中一样,最好让数据库根据简单的正则表达式检查员工 ID 的所有值,而不是在 UI 级别进行。
另一个问题:如果我遇到这样的问题(即需要根据一组额外的约束来验证字段值),这是否意味着我的模式已非规范化并且我应该修复它?
您可以通过字段上的约束进行检查。这取决于您使用的数据库。在 SQL Server 中,您可能必须使用如下语法:
check (len(EmpId) = 7 and left(EmpId, 3) between 'AAA' and 'ZZZ' and
substring(EmpId, 4) = '-' and isnumeric(right(EmpId, 4)) = 1
首先,检查约束进入表创建,前面是“CONSTRAINT 语句。
其次,正则表达式将是一种更简洁的方法。但是,并非所有数据库都支持它们。
第三,上述内容并不完美。例如,它允许前三个字符使用“B1B”。更复杂的逻辑可以解决这个问题。
最后,为了保证大写,您可能需要将排序规则设置为区分大小写。
关于你的第二个问题,这取决于。(当然视情况而定。它总是视情况而定。)如果您总是将员工标识字符串用作单个“整体”值,那么它就是标准化的。如果你发现你不断地将它们分解成“第一和第二”部分(3 个字符,4 个数字),那么你就是在打破第一个范式。(粗略地说,您在一列中有两个事实,应该将它们分成各自的列。)
假设适当的规范化,在我看来,您必须依靠数据库来确保数据格式正确这一事实引发了对数据源完整性的质疑。为什么数据在传递到数据库之前没有经过检查、清理和正确格式化?RDBMS 非常擅长存储、排序和检索数据,但它们在处理复杂算法方面并不那么热门。这不是他们的目的。您可以在数据库中执行此操作,是的,但有更好的方法可以执行此操作。