检查 SQL Server 数据库上的约束对于数字范围和年份和月份是否可取?

Ber*_*rdV 2 sql-server check-constraints

我正忙于设计一个网站,我需要在我的 SQL Server 数据库中包含以下列:

  1. 分配(从 0 到 100 的值)
  2. 年(仅)
  3. 月(仅)

我已经阅读了有关检查约束的内容,我想知道以下是否可行/以及它是否是上述问题的最佳解决方案:

allocation  | tinyint | not null | check constraint: 0-100
year        | date    | not null | check constraint: year
month       | date    | not null | check constraint: month
Run Code Online (Sandbox Code Playgroud)

我也会从我的前端进行验证,但我听说在适当的地方设计带有这些限制的数据库是一种很好的做法。

Bas*_*que 6

是的,使用检查约束

是的,您应该添加检查约束在数据库中以确保有效值,并检查您的应用程序。数据库端会进行双重检查,以防您的应用程序代码有漏洞或错误。此外,您可以使用其他应用程序(例如数据库管理工具)与您的数据进行交互,因此最好让数据库执行规则。

这种数据验证正是检查约束的目的。

也检查年和月

顺便说一下,您的年和月列不应是 DATE 数据类型。对它们也使用一个小整数,并为合理的年份值(例如 >2016 和 1-12 个月)添加约束检查。

ISO 8601

还可以考虑将您的年月值存储为 text/varchar 类型的单列,根据ISO 8601标准格式化:YYYY-MM,例如2017-03. 按字母顺序排序恰好也是按时间顺序排列的。

顺便说一下,Java 包含一个YearMonth类来表示这种值。默认情况下,该类可以使用其toStringparse方法生成和解析 ISO 8601 格式的字符串。

避免关键字作为名称

避免使用各种数据库使用的一千多个关键字和保留字中的任何一个。您的“年”和“月”名称可能有问题。

我使用的简单解决方案是在我的所有 SQL 名称(目录、架构、表、列、索引等)中附加一个尾随下划线。所以,year_month_。SQL 规范明确承诺任何关键字都不会带有尾随下划线。