知识卡片

关系模型的声明式本质

普通读书笔记卡

内容

关系模型在本质上是声明式的,而不是过程化的——只要存在可行的声明式方案,关系模型 总是优先选择声明式而非过程化的解决路径。这个偏好的原因直接指向责任归属:声明式 方案意味着”怎么算”这件事交给系统负责,用户只需要说清楚”要什么”;过程化方案则意味着 “怎么算”要由用户亲自负责,需要手写具体的执行步骤(比如[[模型与实现的区分及连接 很慢为何没有意义]]中提到的手写嵌套循环反例)。这正是为什么关系模型要支持声明式 查询、声明式更新、声明式视图定义、声明式完整性约束——把执行细节留给实现层去优化, 用户只需要正确表达意图本身,这也是生产力差异的根源。这个原则也带来一条实用的 警惕提示:书中提到至少有一个知名SQL产品滥用了”声明式”这个术语——允许用户以 声明式的方式表述某些内容(比如声明某个视图具有某个键),却并不真正在系统内部 强制这个约束成立,而是简单地假定用户会自己保证它成立;这种”允许声明但不强制约束” 的做法名不副实,读者需要对这类术语滥用保持警觉,不要把”支持声明式语法”和”真正 提供声明式保证”混为一谈。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第1章"做好准备"1.10节 "小结"(源文件:OEBPS/text00016.html) - 结论依据:原文明确"关系模型本质上是声明式的而不是过程化的……只要方案是可行的, 关系模型总是喜欢声明式的解决方案甚于过程化的解决方案。原因很明显:声明式方案 意味着由系统负责具体运算,而过程化方案则意味着由用户负责具体运算""至少有一个 知名SQL产品明确使用'声明式'术语来表示'系统不做工作'……它允许用户声明式地表述 一些内容……但是却并不强制声明所隐含的约束"。 - 原始内容:关系模型本质上是声明式的而不是过程化的……声明式方案意味着由系统负责 具体运算,而过程化方案则意味着由用户负责具体运算……如算此滥用术语无助于形成 真正的理解。读者要擦亮眼睛。