Sql 实现方法选择
Sql implementation method choice
我对构造 sql 约束感到困惑。
假设我有两个 table 命名的人和 rent_car。人有两列名为 person_id,工作。 rent_car 还有两列名为 person_id 和 renting_date.
约束:
- 如果此人是医生,则 he/she 只能在 12.00 到 19 点之间租车。00.Other 人们可以在 10.00 到 18.00 之间租车。
- 如果此人是医生,则 id 必须包含 "dr"。
哪种方法适合我?触发、检查或断言,为什么?
触发器发生, 声明性约束是。
声明性约束描述了一个状态,其中数据有效,因此必须始终满足它们。这意味着如果记录中的数据发生变化,则关于声明性约束的记录的有效性只能改变;记录的有效性 不得 由于宇宙其他部分的某些事件而改变。这就是为什么在强制执行它们的系统上,检查约束可能不会引用随时间变化的系统变量,例如 CURRENT_TIME
或 CURRENT_USER
,或 table 中的其他记录或记录在其他 table 中。外键约束的 ON DELETE
和 ON UPDATE
子句防止父 table 中的更改使子 table.
中的记录无效
另一方面,触发器是在离散时间点执行的过程。它执行的任何测试只需要在执行它们的瞬间得到满足,并且只针对它们参数的瞬时值进行测试。因此,触发器可以自由引用动态系统变量、其他记录、其他 table 甚至其他数据库。
那么针对你的问题。当您将记录与常量字符串进行比较时,我会为您的第二种情况使用声明性约束。对于租金,这将取决于。如果数据库正在记录发生 "right now," 的租金,则将时间与 "right now" 进行比较,这只能在触发器中完成。如果 table 记录了 未来租赁的预订, 则租赁时间将与常量进行比较,检查约束将是合适的。
据我了解,断言是一种工具,用于测试 代码的正确性, 而不是 数据的正确性, 等等不是实施业务规则的合适工具。
希望对您有所帮助。
我对构造 sql 约束感到困惑。
假设我有两个 table 命名的人和 rent_car。人有两列名为 person_id,工作。 rent_car 还有两列名为 person_id 和 renting_date.
约束:
- 如果此人是医生,则 he/she 只能在 12.00 到 19 点之间租车。00.Other 人们可以在 10.00 到 18.00 之间租车。
- 如果此人是医生,则 id 必须包含 "dr"。
哪种方法适合我?触发、检查或断言,为什么?
触发器发生, 声明性约束是。
声明性约束描述了一个状态,其中数据有效,因此必须始终满足它们。这意味着如果记录中的数据发生变化,则关于声明性约束的记录的有效性只能改变;记录的有效性 不得 由于宇宙其他部分的某些事件而改变。这就是为什么在强制执行它们的系统上,检查约束可能不会引用随时间变化的系统变量,例如 CURRENT_TIME
或 CURRENT_USER
,或 table 中的其他记录或记录在其他 table 中。外键约束的 ON DELETE
和 ON UPDATE
子句防止父 table 中的更改使子 table.
另一方面,触发器是在离散时间点执行的过程。它执行的任何测试只需要在执行它们的瞬间得到满足,并且只针对它们参数的瞬时值进行测试。因此,触发器可以自由引用动态系统变量、其他记录、其他 table 甚至其他数据库。
那么针对你的问题。当您将记录与常量字符串进行比较时,我会为您的第二种情况使用声明性约束。对于租金,这将取决于。如果数据库正在记录发生 "right now," 的租金,则将时间与 "right now" 进行比较,这只能在触发器中完成。如果 table 记录了 未来租赁的预订, 则租赁时间将与常量进行比较,检查约束将是合适的。
据我了解,断言是一种工具,用于测试 代码的正确性, 而不是 数据的正确性, 等等不是实施业务规则的合适工具。
希望对您有所帮助。