领英谁给个截图啊?不知道加符号在哪里啊?谢谢!

语言的极限即世界的极限

—— 路德维奇·维特根斯坦, 《逻辑哲学》(1922)


数据模型可能是开发软件最重要的部分因为它们有着深远的影响:不仅在于软件的编写方式,洏且在于它如何影响对问题解决方案的思考

大多数应用程序是通过将一个数据模型叠加在另一个之上来构建的。对于每一层关键问题昰:它是如何用下一层来表示的?例如:

  1. 作为一名应用程序开发人员您将看到现实世界(包括人员,组织货物,行为资金流向,传感器等)并根据对象或数据结构以及API进行建模,操纵这些数据结构这些结构通常是应用程序特定的。
  2. 如果要存储这些数据结构可以使用通用数据模型(如JSON或XML文档,关系数据库中的表、或图模型)来表示它们
  3. 构建数据库软件的工程师决定以内存,磁盘或网络上的字节表示JSON / XML /关系/图形数据该表示可以允许以各种方式查询,搜索操纵和处理数据。
  4. 在更低的层面上硬件工程师已经计算出如何用电流,光脈冲磁场等来表示字节。

在一个复杂的应用程序中可能会有更多的中间层次,比如基于API的API但是基本思想仍然是一样的:每个层都通過提供一个干净的数据模型来隐藏下面层的复杂性。这些抽象允许不同的人群(例如数据库供应商的工程师和使用他们的数据库的应用程序开发人员)有效地协作

有许多不同类型的数据模型,每个数据模型都体现了如何使用它的假设某些用法很容易,有些不被支持;一些操作很快一些操作不好;一些数据转换感觉自然,有些是尴尬的

掌握一个数据模型可能需要很多努力(想想关系数据建模有多少本书)。即使只使用一种数据模型而不用担心其内部工作,构建软件也是非常困难的但是由于数据模型对软件的功能有很大的影响,因此选擇适合应用程序的软件是非常重要的

在本章中,我们将研究一系列用于数据存储和查询的通用数据模型(前面列表中的第2点)特别是,我们将比较关系模型文档模型和一些基于图形的数据模型。我们还将查看各种查询语言并比较它们的用例在第3章中,我们将讨论存儲引擎是如何工作的也就是说,这些数据模型是如何实际实现的(列表中的第3点)

现在最着名的数据模型可能是SQL,它基于Edgar Codd在1970年提出的關系模型[1]:数据被组织到关系中(称为SQL表)其中每个关系是元组的无序集合SQL中的行)。

关系模型是一个理论上的建议当时很多人怀疑昰否能够有效实施。然而到了20世纪80年代中期,关系数据库管理系统(RDBMSes)和SQL已成为大多数需要存储和查询具有某种规模结构的数据的人们嘚首选工具关系数据库的优势已经持续了大约25 - 30年 - 计算历史上的一个永恒。

关系数据库的根源在于商业数据处理这是在20世纪60年代和70年代茬大型计算机上进行的。从今天的角度来看用例显得很平常:通常是交易处理(进入销售或银行交易,航空公司预订仓库库存)和批處理(客户发票,工资单报告)。

当时的其他数据库迫使应用程序开发人员考虑数据库内部的数据表示关系模型的目标是将实现细节隱藏在更简洁的界面之后。

多年来在数据存储和查询方面存在着许多相互竞争的方法。在20世纪70年代和80年代初网络模型和分层模型是主偠的选择,但关系模型占据了主导地位对象数据库在二十世纪八十年代末和九十年代初再次出现。 XML数据库出现在二十一世纪初但只有尛众采用。关系模型的每个竞争者都在其时代产生了大量的炒作但从来没有持续[2]。

随着电脑越来越强大和联网它们开始被用于日益多樣化的目的。值得注意的是关系数据库在业务数据处理的原始范围之外被推广到很广泛的用例。您今天在网上看到的大部分内容仍然是甴关系数据库提供支持无论是在线发布,讨论社交网络,电子商务游戏,软件即服务生产力应用程序等等

现在,在2010年代NoSQL是推翻關系模式主导地位的最新尝试。 “NoSQL”这个名字是不幸的因为它实际上并没有涉及到任何特定的技术,它最初只是作为一个吸引人的Twitter标签茬2009年的开源分布式,非关系数据库上聚会无论如何,这个术语触动了一个神经并迅速通过网络启动社区和更远的地方传播开来。一些有趣的数据库系统现在与#NoSQL#标签相关联并被追溯性地重新解释为不仅是SQL [4]。

采用NoSQL数据库有几个驱动力其中包括:

  • 需要比关系数据库更恏的可扩展性,包括非常大的数据集或非常高的写入吞吐量
  • 相比商业数据库产品偏爱免费和开源软件
  • 关系模型不能很好地支持一些特殊嘚查询操作
  • 对关系模型限制性感到受挫,对更多动态性与表现力的渴望

不同的应用程序有不同的要求一个用例的最佳技术选择可能不同於另一个用例的最佳选择。因此在可预见的未来,关系数据库似乎可能会继续与各种非关系数据库一起使用 - 这种想法有时也被称为混合歭久化(Polyglot Persistences)

现在大多数应用程序开发都是在面向对象的编程语言中完成的这导致了对SQL数据模型的普遍批评:如果数据存储在关系表中,那么应用程序代码中的对象之间需要一个笨拙的转换层表,行和列的数据库模型模型之间的不连贯有时被称为阻抗不匹配(impedance mismatch 从电子学借用一个术语。每个电路的输入和输出都有一定的阻抗(交流电阻)当您将一个电路的输出连接到另一个电路的输入时,如果两个电路嘚输出和输入阻抗匹配则连接上的功率传输将被最大化。阻抗不匹配可能导致信号反射和其他问题)

像ActiveRecord和Hibernate这样的对象关系映射(ORM)框架减少了这个翻译层需要的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异

图2-1 使用关系型模式来表示领英简历

例如,图2-1展示了如何在关系模式中表达简历(一个LinkedIn简介)整个配置文件可以通过一个唯一的标识符user_id来标识。像first_name和last_name这样的字段每个用户只出现一次所以他们可以在用户表上建模为列。但是大多数人的职业(职位)多于一份工作,人们可能有不同的教育期限和不同数量的联系信息从用户到这些项目之间存在一对多的关系,可以用多种方式来表示:

  • 在传统SQL模型(SQL:1999之前)中最常见的规范化表示形式是将职位,培訓和联系信息放在单独的表中对用户表提供外键引用,如图2-1所示
  • 更高版本的SQL标准增加了对结构化数据类型和XML数据的支持;这允许将多值數据存储在单行内,支持在这些文档内查询和索引这些功能在Oracle,IBM DB2MS SQL Server和PostgreSQL中都有不同程度的支持[6,7]。 JSON数据类型也受到几个数据库的支持包括IBM DB2,MySQL和PostgreSQL [8]
  • 第三种选择是将作业,教育和联系信息编码为JSON或XML文档将其存储在数据库的文本列中,并让应用程序解释其结构和内容在此设置Φ,通常不能使用数据库查询该编码列中的值
从RDF的角度来看,URL 不一定需要能解析成什么东西它只是一个命名空间。为避免与http://URL混淆本節中的示例使用不可解析的URI,如urn:example:within幸运的是,您只需在文件顶部指定一个前缀然后忘记它。

SPARQL是 RDF数据模型三元组存储的查询语言[43] (咜是SPARQL协议和RDF查询语言的缩写,发音为“sparkle”)它早于Cypher,并且由于Cypher的模式匹配是从SPARQL中借用的所以它们看起来非常相似[37]。 与从前从美国转移箌欧洲的人相同的查询 - 在SPARQL中比在Cypher中更加简洁(请参见示例2-9) 例2-9。与示例2-4相同的查询用SPARQL表示

结构非常相似。以下两个表达式是等价的(變量以SPARQL中的问号开头):

由于RDF不区分属性和边而只是使用两个属性,所以可以使用相同的语法来匹配属性在下面的表达式中,变量usa被綁定到任何具有值为字符串“United States”的name属性的顶点:

SPARQL是一种很好的查询语言 - 即使语义网从来没有出现它也可以成为应用程序内部使用的强大笁具。

图形数据库与网络模型相比较

在第36页的“文档数据库是否重复历史”中,我们讨论了CODASYL和关系模型如何竞争解决IMS中的多对多关系问題乍一看,CODASYL的网络模型看起来与图模型相似 CODASYL是否是图形数据库的第二个变种? 不他们在几个重要方面有所不同:

  • 在CODASYL中,数据库有一個模式指定哪种记录类型可以嵌套在其他记录类型中。在图形数据库中不存在这样的限制:任何顶点都可以具有到其他任何顶点的边。这为应用程序适应不断变化的需求提供了更大的灵活性
  • 在CODASYL中,达到特定记录的唯一方法是遍历其中的一个访问路径在图形数据库中,可以通过其唯一ID直接引用任何顶点也可以使用索引来查找具有特定值的顶点。
  • 在CODASYL记录的孩子们的有序集合,所以数据库的人不得不維持排序(其中有用于存储布局的后果)并且插入新记录到数据库的应用程序不得不担心的新记录的位置在这些集合中。在图形数据库Φ顶点和边不是有序的(您只能在查询时对结果进行排序)。
  • 在CODASYL中所有查询都是必要的,难以编写并且很容易被架构中的变化破坏。在图形数据库中如果需要,可以在命令式代码中编写遍历但大多数图形数据库也支持高级声明式查询语言,如Cypher或SPARQL

Datalog是比SPARQL或Cypher更古老的語言,在20世纪80年代被学者广泛研究[44,45,46]它在软件工程师中是不太知名的,但是它是重要的因为它为以后的查询语言提供了基础。

在实践中Datalog在一些数据系统中被使用:例如,它是Datomic [40]的查询语言而Cascalog [47]是用于查询Hadoop中的大数据集的Datalog实现(Datomic和Cascalog使用Datalog的Clojure S表达式语法。 在下面的例子中使用了┅个更容易阅读的Prolog语法没有任何功能差异。)

Datalog的数据模型类似于三元组模式但有一点泛化。我们把它写成谓词(主语宾语),而不昰写三元语(主语宾语,宾语)例2-10显示了如何在Datalog中写入我们的例子中的数据。

现在我们已经定义了数据我们可以像之前一样编写相哃的查询,如例2-11所示它看起来有点不同于Cypher或SPARQL的等价物,但是不要让你失望 Datalog是Prolog的一个子集,如果你已经学过计算机科学你可能已经见過。

例2-11与示例2-4相同的查询,在Datalog中表示

Cypher和SPARQL使用SELECT立即跳转但是Datalog一次只需要一小步。我们定义告诉数据库有关新谓词的规则:在这里我们萣义了两个新的谓词,在_recursive和migrated内这些谓词不是存储在数据库中的三元组,而是它们是从数据或其他规则派生而来的规则可以引用其他规則,就像函数可以调用其他函数或者自发地调用自己一样像这样,复杂的查询可以一次构建一小块

如果系统可以在 - 操作符的右侧找到與所有谓词相匹配的规则,则适用该规则当规则适用时,就好像将 - 的左边添加到数据库(用变量替换它们的值)

因此,应用规则的一種可能的方式是:

  1. 在(爱达荷州美国)存在于数据库和上一步生成within_recursive(美国,“北美”)所以规则2适用。它产生within_recursive(爱达荷州“北美”)。

通过重复应用规则1和2within_recursive谓词可以告诉我们在我们的数据库中包含的北美(或任何其他位置名称)的所有位置。这个过程如图2-6所示

图2-6. 使用示例2-11中的Datalog规则确定爱达荷州在北美。

现在规则3可以找到出生在某个地方BornIn的人并住在某个地方LivingIn。通过查询BornIn ='United States'和LivingIn ='Europe'并将此人作为变量Who,我們要求Datalog系统找出变量Who可以出现哪些值因此,最后我们得到了与早先的Cypher和SPARQL查询相同的答案

Datalog方法需要对本章讨论的其他查询语言采取不同嘚思维方式,但这是一种非常强大的方法因为规则可以在不同的查询中进行组合和重用。简单的一次性查询不太方便但是如果数据很複杂,它可以更好地处理

数据模型是一个巨大的课题,在本章中我们快速浏览了各种不同的模型。我们没有足够的空间来详细介绍每個模型的细节但是希望这个概述足以激起您的兴趣,以更多地了解最适合您的应用需求的模型

在历史上,数据开始被表示为一棵大树(层次数据模型)但是这不利于表示多对多的关系,所以发明了关系模型来解决这个问题最近,开发人员发现一些应用程序也不适合茬关系模型中使用新的非关系型“NoSQL”数据存储在两个主要方向上有分歧:

  1. 文档数据库的应用场景是:数据通常是自我包含的,而且文档の间的关系非常罕见
  2. 图形数据库用于相反的场景: 任何东西都可能和任何东西相关联。

所有这三种模型(文档关系和图形)今天都被廣泛使用,并且在各自的领域都是很好用的一个模型可以用另一个模型来模拟 - 例如,图形数据可以在关系数据库中表示 - 但结果往往是尴尬的这就是为什么我们有不同的系统用于不同的目的,而不是一个单一的万能解决方案

文档数据库和图数据库有一个共同点,那就是咜们通常不会为存储的数据强制实施一个模式这可以使应用程序更容易适应不断变化的需求。但是应用程序很可能仍假定数据具有一定嘚结构:这只是模式是明确的(强制写入)还是隐含的(在读取时处理)的问题

每个数据模型都带有自己的查询语言或框架,我们讨论叻几个例子:SQLMapReduce,MongoDB的聚合管道Cypher,SPARQL和Datalog我们也谈到了CSS和XSL / XPath,它们不是数据库查询语言而包含有趣的相似之处。

虽然我们已经覆盖了很多地方但仍然有许多数据模型没有提到。举几个简单的例子:

  • 研究人员使用基因组数据通常需要执行序列相似性搜索这意味着需要一个很長的字符串(代表一个DNA分子),并将其与一个类似但不完全相同的大型字符串数据库进行匹配这里所描述的数据库都不能处理这种用法,这就是为什么研究人员编写了像GenBank这样的专门的基因组数据库软件的原因[48]
  • 粒子物理学家数十年来一直在进行大数据类型的大规模数据分析,像大型强子对撞机(LHC)这样的项目现在可以工作在数百亿兆字节的范围内!在这样的规模下需要定制解决方案来阻止硬件成本从失控中解脱出来[49]。
  • 全文搜索可以说是一种经常与数据库一起使用的数据模型信息检索是一个大的专业课题,在本书中我们不会详细介绍泹是我们将在第三章和第三章中介绍搜索指标。

在下一章中我们将讨论在实现本章描述的数据模型时会发挥的一些权衡。

您好一般情况下,是在核销或鍺勾稽的地方先反核销或者反勾稽再反审核,就可以反结算了麻烦您截图看看,以方便老师理解和解答谢谢。

帖子很冷清卤煮很失落!求安慰

当前经验25分,升级还需255

更新8.0以后自动出现一个领英APP是做什么的?找工作的

很棒的分享,意见中肯相信对其它用户也会有帮助。
嫃是好贴受教了,回家就调试去
看到楼主我有种智商上的优越

我要回帖

 

随机推荐