是否可以在一般数据库中指定数据值的范围?

时间:2015-08-04 12:15:47

标签: database database-design database-schema

我想处理一般数据库中某些范围的某些数据,并预定义每个数据项的范围。一些的范围是连续的,如从最小值到最大值的浮点数,其他的范围是离散的,如可以是美国,日本或西班牙的人的国籍,大但有限的范围备择方案。这种模式通常在业务逻辑层实现,我想知道我是否可以在数据库层中处理它,特别是在非SQL数据库中。

1 个答案:

答案 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约束来确保它不会可以插入相关域表中不存在的数据。