我正忙于设计一个网站,并且我的 SQL Server 数据库中有以下列的要求:
- 分配(值从 0 到 100)
- 年(仅)
- 月(仅)
我已经阅读了有关检查约束的内容,我想知道以下内容是否可行/以及它是否是上述内容的最佳解决方案:
allocation | tinyint | not null | check constraint: 0-100
year | date | not null | check constraint: year
month | date | not null | check constraint: month
我也会从我的前端方面进行验证,但我听说最好在适当的地方设计具有这些限制的数据库。
是的,使用检查约束
是的,您应该在数据库中添加检查约束以确保有效值,并检查您的应用程序。如果您的应用程序代码有漏洞或错误,数据库端会进行双重检查。此外,您可以使用其他应用程序(例如数据库管理工具)与您的数据进行交互,因此最好让数据库执行规则。
这种数据验证正是检查约束的目的。
还要检查年份和月份
顺便说一下,您的年份和月份列不应该是 DATE 数据类型。也为它们使用一个小的 int,并为合理的年份值(例如 >2016 和 1-12 的月份)添加约束检查。
国际标准化组织 8601
还可以考虑将年月值存储为文本/varchar 类型的单列,格式根据ISO 8601标准:YYYY-MM 例如
2017-03
. 按字母顺序排序恰好也是按时间顺序排序的。顺便说一下,Java 包含一个
YearMonth
类来表示这种值。toString
该类可以使用其和parse
方法默认生成和解析 ISO 8601 格式的字符串。避免使用关键字作为名称
避免使用各种数据库使用的一千多个关键字和保留字中的任何一个。您的“年”和“月”名称可能有问题。
我使用的简单解决方案是在所有 SQL 名称(目录、架构、表、列、索引等)中附加尾随下划线。所以,
year_
和month_
。SQL 规范明确承诺任何关键字都不会有尾随下划线。