我想处理一般数据库中某些范围的某些数据,并预定义每个数据项的范围。一些的范围是连续的,如从最小值到最大值的浮点数,其他的范围是离散的,如可以是美国,日本或西班牙的人的国籍,大但有限的范围备择方案。这种模式通常在业务逻辑层实现,我想知道我是否可以在数据库层中处理它,特别是在非SQL数据库中。
答案 0 :(得分:1)
当我写这个答案时,问题一般是数据库,而不是非SQL数据库。
在许多(关系型)数据库中,您可以使用数据库中的check
约束来处理此问题,该约束允许您使用布尔表达式定义可接受的值。这适用于插入和更新语句。
适用于MSSQL和Postgresql的示例:
create table t
(
-- country_code has to be a Nordic country.
country_code varchar(20) check (country_code in ('NO','SE','DK', 'FI','IS')),
-- float_value has to be in a certain range
float_value float check (float_value between 0.01 and 0.05),
-- int_value has to be in a range, and in steps of 5
int_value int check ( (int_value between 10 and 50) and (int_value % 5 = 0) )
);
-- allowed
insert into t values ('SE', 0.03, 25);
-- not allowed as int_value is not divisible by 5
insert into t values ('SE', 0.03, 26);
-- disallowed due to country_code not in set
insert into t values ('US', 0.05, 25);
有关更多信息和示例,请参阅documentation for Postgresql。
另一种选择是在插入之前或之后使用触发器,它允许您验证数据并执行比检查约束允许的更复杂的处理(如其他表中的参考数据)。但触发器可能对性能不利。
如果要将可能值的范围限制在预定义范围内,您还可以将这些值存储在表格中(如countries(code, name)
)并使用foreign key
约束来确保它不会可以插入相关域表中不存在的数据。