在我们继续讨论任何/或数据的物理表征之前,我们需要讨论擦除的想法。在计算机科学中,您最常听到“类型擦除”。如果在具有更强的编程语言中在编程语言中编写程序,则结果程序通常不包含类型信息(它被删除)。我们可以在此过程与数据建模过程之间找到有趣的相似之处。
NB:类型检查领域非常复杂,通常在推理中需要大量的精确度。然而,我们这里的真实目标是在数据库建模中建立擦除的概念。我们使用类型擦除只是为了说明这种概念。
我们将用JavaScript用作示例。值得庆幸的是,最琐碎的例子足以介绍我们的目的,因此以下文本需要与JavaScript的零体验。
JavaScript是一种动态类型的编程语言。还有一个更高级的JavaScript扩展名为TypeScript。 TypeScript是一种静态类型的编程语言。静态类型检查有助于编译器在我们的代码中查找许多类别的错误。让我们在输入的类型中编写一个微不足道的函数,以计算数组元素的总和:
// file:sum_arr.tsfunction sum_arr(arr:number []):number {let结果= 0; arr.foreach((num)=>结果+ = num);返回结果;} console.log(sum_arr([2,3,5,7])); //打印17,它是2 + 3 + 5 + 7
第一行对我们的讨论最重要。它声明该函数占据数组(“:number []”部分),它返回一个数字。借助类型声明的帮助,编译器能够在代码中查找许多不同的错误。例如,如果我们不小心使用应该使用文本字符串而不是数字使用的一些函数,则编译器将抱怨并拒绝编译此程序。
TypeScript有趣的是,如果删除所有类型的声明,则剩余的内容将是JavaScript中的有效代码:
// file:sum_arr.jsfunction sum_arr(arr){let结果= 0; arr.foreach((num)=>结果+ = num);返回结果;} console.log(sum_arr([2,3,5,7])); //打印17
这是一个完美有效的程序,如果您没有使用打字签,则可以在JavaScript中完全写入,它将是正确的代码。成千上万的人每天都在javascript中写下。
因此,可以通过删除类型声明来转换为JavaScript的打字程序:即按类型擦除。您的浏览器无法直接执行打字程序,因此它需要这种预处理。或者,您可以直接在JavaScript中编写一个程序,然后直接在浏览器中运行它。
那么,我们为什么需要打字签字?因为当我们在我们的计划中改变某些东西时,我们可能会犯错误。类型签字编译器将能够捕获其中一些错误,因为类型声明仍然存在。
如果更改JavaScript代码,则只能通过其他方式找到这些错误:自动化和手动测试,思考难,审阅代码,或在生产中运行代码并等待用户的投诉。所有这些方法都没有错,真的:您的其他工程实践可能会帮助您减轻潜在错误的后果。
如果我们将丢失此程序的原始版本源,我们可以继续直接更改JavaScript代码,只需在编译器中的帮助下,并且在了解原始代码中的所有相关风险。
我们经常在表格,字段,主要键,正常形式等方面考虑数据库模式等。我们在学习数据库编程时,我们中的许多人都学到了这种方法。但肯定是一个高于这个水平。我们可以看到,因为有多种方式通过表来表示许多数据结构。
我们在上一篇文章中看到了:您可以在主表中放置一个“has_symptoms”属性,侧表或每个属性表中。但是,我们的伪代码更高级别表示(逻辑架构)保持不变:
如上所述,可能的逻辑模式的数量小于可能的物理表模式的数量:一个逻辑架构存在三种物理模式,这仅适用于物理表示的关切之一。
擦除替换示例有一个并行:可能的缩写程序的数量小于可能的JavaScript程序的数量。首先,我们可以编写包含缩写编译器所捕获的错误的JavaScript程序,并且这些程序将在JavaScript中有效(虽然是错误的)程序。其次,根据我们的优化需求,可以以不同方式重新组织代码以不同方式重新组织代码,因此可以在许多方面以javascript表示相同的功能。
另一个并行是,通常您无权访问数据库的逻辑架构:您只有物理表架构,字段,主键和索引。如果你只是在这个级别工作,你就可以走了很长的路法:添加或删除字段,添加或删除表。成千上万的人每天执行SQL ALTER ORPerators,绝对没有错!
当然有一个原因,每个物理模式背后的想法。它可能无法明确记录,但是您可以通过查看表的结构,在与这些表一起使用的代码中,甚至处于存储在这些表中的数据中,您可以从各种提示中收集它。此外,您可以阅读旧文件或与在您之前加入贵公司的人交谈并记住更多历史。
同样的方式,如果您查看上面的JavaScript代码,您可以快速假设此功能从各种提示中接受一系列数字:函数的名称是“SUM”,因此它可能不是字符串;并且代码使用foreach函数的事实表明,ARR是数组(此外,参数名称可能意味着“array”)。但是,如果你有一个原始的打字代码,你可能会绝对确定,你不必猜测。
互联网和其他地方的大量数据库建模建议讨论了数据库标准化作为指导原则。但如果正常形式也是可擦除的,那么怎么样?在上一部分中,我们提出了一个假设,即物理表的水平可能不是思考数据库建模的唯一级别。正常形式虽然是物理表的属性:我们说他们处于这或正常形式。
无论哪种级别是什么,正常形式都不存在于物理表上方的水平上吗?
如果我们看看我们在上一篇文章中提出的所有表,我们会看到他们真的很常见化!所有这些至少是第三正常形式;如果我们使用每个属性表,他们甚至可能处于第六正常形式。然而,在这个时尚中我们甚至提到了正常形式。
是否意味着存在不需要正常形式的更高水平的建模表示?或者我们实际上使用了正常化的想法而不意识到它?或者我们刚刚幸运,同样的方式可以不小心写一个没有错误的JavaScript程序?
此外,如果我们通过我们的任何一个/或例子来保持正常化,我们会看到正常化并没有帮助我们维护我们的不变性:我们想存储“有症状”案例的症状列表,或者PCR测试结果在“无症状”案例中,但是既有它们又有两个都是不正确的。表规范化允许我们防止许多数据问题,但它可以维护这种特定的不变吗?答案尚不清楚。是否有维护这种不变的方式?他们如何与规范化相关?通常,哪些不变性可以且不能通过归一化维护?
哦,顺便说一句:为什么我们甚至想找到逻辑模式?我们的答案是,理性是我们被最小地的原则为指导。
本节有很多问题:我们目前没有答案,真的,只是一个亨希,这可能是一个有趣的方向。
但要找到一些额外的论点,我们将继续我们的长途旅程来朝着或数据的数据库表示。在下一个帖子中,我们将使用我们在上一篇文章中提出的表来讨论如何实际编写/或数据值。