网页相关知识
网页前端“三剑客”
典型的网页一般是由HTML、CSS、JavaScript三种语言共同完成的,这三种语言常被称为网页前端“三剑客”。HTML 相当于一个文档,它通过标签把信息进行编排和呈现;CSS 可以对这些文档进行修饰、美化,提升视觉效果;JavaScript 实现了网页和用户的互动。如果把页面比作一扇门,那么HTML是门板,CSS是色泽或花纹,JavaScript就是门的把手。
HTML——网页的主体(HTML超文本标记语言)
HTML 是超文本标记语言。之所以被称为“超文本”,是因为它不仅仅适用于纯文字,还可以对图片、音乐等超出文本的内容进行标记。HTML并不是一种编程语言,而是一种标记语言,是一种协议和规范。HTML代码相当于一个带有规范的文档,文档中包含的是呈现给用户的信息,包括文字、图片、链接、声音等。HTML提供了一些标签,用标签标记的方法把想要传递给用户的信息进行有序的排列,并通过浏览器的解析而呈现给用户。
CSS——进行样式的修饰(CSS浏览器解释型语言)
CSS的全称是“层叠CSS文件”,用于定义如何显示HTML元素或XML元素,比如指定文字的颜色、大小、字体,以及按钮或输入框的样式等,然后将其插入到HTML 网页的<;style>;标签中,这样展示出来的就是 CSS 设置的风格了。其主要作用就是对页面进行修饰,实现更好的视觉效果,让用户接收信息更加舒服自然。CSS属于浏览器解释型语言,可以直接由浏览器执行。
JavaScript——实现操作行为(JS网页交互设计语言)
JavaScript(简写为 JS)是用来控制网页的行为效果的,即内容应该如何对事件做出反应。例如它可以设置鼠标悬停效果、在客户端验证表单、显示警告框、设置Cookie等。使用JavaScript代码可以为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。网页中所有对数据进行判断、处理的操作,以及向浏览者反馈信息的本地代码实现部分,均可以由JavaScript(当然也有可能是其他的语言)实现。使用JavaScript 可以使网页更具交互性,给用户提供更令人兴奋的体验,同时减轻了服务器负担。
网页后端技术
HTML、CSS、JavaScript 三剑客完成了网页的视觉和交互层面的工作,那么谁来完成数据的逻辑处理和规则运算工作呢?这时候就需要后端开发语言,比如PHP、Java等。
PHP是一种通用解释型开源脚本语言,具有开发周期短、跨平台、安全、使用广泛等特点。PHP语言将程序嵌入到HTML文档中去执行,执行效率高。使用PHP语言能够更快地完成网页前端频繁而琐碎的更新,自如地应对各种业务需求的变化。因此,页面的结构调整、用户输入内容的基本验证、规则逻辑等,都适合使用PHP开发。
Java也是常用的后端语言,它可以有效地提高复用度、提升性能和吞吐能力、规避安全问题。Java语言的运行效率高,不容易犯错,适合大中项目。但Java语言也有缺点,比如其开发复杂、维护成本高等。在国内的大公司里,偏业务的程序员一般都会使用Java语言。
当然还有其他语言可用于处理底层逻辑运算,比如ASP.NET、C++等语言。
一个完整的网站通常由前端代码实现界面效果,由后端代码完成逻辑运算和数据处理。这种前后端分离的模式,确保网页性能稳定、快速且安全。
浏览器
1.浏览器的概念
网页是通过在浏览器上加载来呈现的。浏览器的主要功能是将用户选择的 Web资源呈现出来,其通过向Web服务器请求资源,并对资源进行解析,将资源中的内容显示在浏览器窗口中。浏览器的种类比较多,对规范的遵循方式并不一致,这也是Web页面兼容性问题的根源。浏览器的用户界面都差不多,常见的用户界面元素包括:地址栏、前进和后退按钮、书签选项、刷新和暂停按钮、主页按钮等。
2.浏览器的主要组件
浏览器相当于一个应用程序,其展示的内容是由其访问的服务器提供的。浏览器支撑浏览功能的组件包括但不限于如下。
(1)用户界面:即用户看到的界面,主要包括地址栏、前进和后退按钮、书签等,也就是浏览器上除了用来显示所请求页面的主窗口之外的其他部分。
(2)渲染引擎:用来解析并渲染所请求的内容,即在浏览器窗口中显示所请求的内容,比如使用PDF查看器插件就能显示PDF文档。渲染引擎是每一个浏览器的核心部分,所以渲染引擎也称为浏览器内核。
(3)浏览器引擎:用来查询及操作渲染引擎的接口,这也是一个核心功能,相当于浏览器的动力装置。
(4)JavaScript解释器:用来解释并执行JavaScript代码的工具。
(5)数据存储:浏览器需要在硬盘中保存类似Cookie、缓存的各种数据,其是一种客户端存储技术。
(6)其他组件。
3.主流浏览器和壳浏览器主流浏览器:拥有独立内核的浏览器被称为主流浏览器。
壳浏览器:在某个浏览器内核之上增加相应的辅助功能,并改变其名称与外观的浏览器,比如360极速浏览器、UC浏览器、搜狗浏览器、猎豹浏览器、QQ浏览器、2345浏览器等。
相关的协议和概念
1.TCP/IP、HTTP协议
浏览器能够获取并展示页面内容,是通过一些网络协议实现的。网络协议也就是网络标准规范,主要有TCP/IP协议、HTTP协议等。
(1)TCP/IP协议
TCP/IP 协议,指传输控制协议/网际协议(Transmission Control Protocol/InternetProtocol),是用于因特网(Internet)的通信协议,定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。浏览器展示网页内容,需要从服务器获取网页数据,这时候就需要从浏览器(相当于客户端)发 起HTTP请求到服务端,而该请求是基于TCP/IP协议才能生效的。
(2)HTTP协议
HTTP协议,即超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议。浏览器获得了服务器的数据信息之后,该数据信息可能是散乱无序的,如何规范地按照设计者的期望展示给用户呢?这就用到了HTTP协议。HTTP协议是在TCP/IP协议基础之上建立起来的,其初衷是为了提供一种发布和接收HTML页面的方法。
(3)工作过程
当浏览器输入服务器的IP地址后,即开始通过TCP/IP协议向服务器发起HTTP请求,建立起与服务器的连接通道。该通道从服务器 IP 地址获取服务器页面数据,然后根据HTTP协议按照一定格式予以响应,显示页面。这就是通过浏览器访问页面的框架性的机制和流程。
图片
2 .IP地址、域名、网站名、URL、端口
(1)IP地址
如果把计算机比作房间,那么 IP 地址就是房间的地址。IP 地址为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。例如“163.125.121.123”就是一个电脑的IP地址。服务器也有它的 IP 地址,其实际就是提供服务的那台主机的地址。因此访问服务器的IP地址本身就是访问提供服务的主机上的信息。
(2)域名
为对应的 IP 地址指定的一个容易记住的名字,就是域名,例如“google.com”“baidu.com”“163.com”等就是域名。注意,如果域名前面加上“www”,就不再是域名了,而是网站名。域名在本质上是用于标识计算机的电子方位。
(3)网站名
网站名是由“服务器名+域名”组成的,比如某网站的域名是“sitename.com”(此网站域名为虚构,与现实中的任何网站无关,下文同),因为想建立一个万维网的服务器,所以就有了网站名“www.sitename.com”。后来其又想运作邮箱服务器,所以也就有了邮箱网址“email.sitename.com”。为了方便理解上面的概念,我们以网址“http://www.sitename.com/index.html”为例,其各部分的解释如下。
①“http://”是协议,也就是 HTTP 超文本传输协议,即网页在网络上传输的协议。
②“www”是服务器名,代表这是一个万维网服务器。
③“sitename.com”是域名,用来定位网站的独一无二的名字。
④“www.sitename.com”是网站名,由“服务器名+域名”组成。
⑤ 后面的“/”是根目录。用户通过网站名找到服务器,然后就会访问服务器存放网页的根目录。
⑥“index.html”是根目录下的默认网页(大部分的默认网页都是index.html)。
(4)URL
URL即统一资源定位符,也就是我们平时说的网址。URL的构成为“IP或域名+端口号+资源位置+参数+其他”。URL是网页元素的绝对路径,可以用来定位任何查得到的网页、多媒体文件等。互联网上的每个文件都有一个唯一的URL,它包含了文件的位置,以及浏览器对其处理的方式。比如页面上的每一张图片,都有它独一无二的URL,让你在浩瀚的数据世界中找到它。
Web服务器
1.服务器
(1)服务器的概念服务器就是指能对其他设备(客户端)提供某些服务的计算机系统。比如一个计算机对外提供FTP服务,那么它就相当于服务器(端)。基本的服务器就是一台高性能的实体电脑,或者是云端的虚拟机(可以通过互联网租用第三方的云端服务器,比如阿里云、腾讯云)。在网络环境下,根据服务器提供的服务类型不同,其可分为文件服务器、数据库服务器、应用程序服务器、Web服务器等。
图片
(2)服务器的特质由于需要提供高可靠的服务,因此服务器在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面的要求较高,具体包括但不限于如下。
①硬件性能高:服务器在网络中通常以一对多的方式提供服务,需要承担多种应用请求,因此其硬件必须有能力保障服务质量,对内存、容量、运行速度等硬件性能的要求较高。
②稳定性和安全:服务器需要 24 小时不间断工作,要有可靠的数据备份机制、快速恢复故障的功能,以及数据保密措施。
③可扩展性:服务器需要有更广阔的扩展空间,从而随着服务对象的数量、服务业务种类的变化而进行扩展和个性化定制。④与配套设施兼容作业:服务器常常要和附属硬件配合工作,比如交换机、负载均衡器、光缆等。
2.Web服务器
(1)Web服务器的概念
不管什么网页资源,若想被远程计算机访问,都必须有一个与之对应的网络通信程序。当用户访问时,这个网络通信程序会读取Web资源数据,并把数据发送给来访者。Web服务器就是这样一个程序,它用于实现底层网络通信,处理HTTP协议。使用Web服务器,开发者只需要关注Web资源怎么编写,而不需要关心资源如何发送到客户端手中,从而极大地减轻了开发者的工作量。
(2)Web服务器的工作机制
Web页面属于“B/S架构”,即“浏览器/服务器架构”。在这种场景下,客户端使用Web浏览器,通过网络连接到服务器上,使用HTTP协议发起请求,告诉服务器“我”现在需要得到哪个页面,然后把所有的请求交给Web服务器,之后Web服务器根据用户的需要,从文件系统(存放了所有静态页面的磁盘)取出内容,再返回给客户端。客户端在接收到内容之后经过浏览器渲染解析,得到最终显示的效果。
(3)一对多和多对一的Web服务器
如果一个网站必须对应一个Web服务器主机的话,那么很多大公司(比如腾讯)就要有数不尽的服务器。实际上,在一台Web服务器上可以搭建多个网站。与之相反的还有一种情况,就是多个Web服务器为一个网站提供服务。大型网站的Web服务器都有均衡负载策略:虽然是一个IP,但对应的可能是多台内部服务器,由负载均衡策略决定每次访问落实到哪台服务器上。在这种情况下,用户所看到的IP地址,其实所对应的并不是一台Web服务器,而是一个负载均衡器,它负责分发外部请求到具体的Web服务器上,通过合理管理每天的网上数据流量,来减轻单个服务器上的负担,力求让网络访问者享受最佳的联网体验。
图片
2.1.5 缓存、Cookie、Session
1.缓存
(1)什么是缓存
缓存即数据交换的缓冲区,简单说就是临时存储数据的地方,其可以存储一些高频数据的副本。缓存无处不在,有浏览器端的缓存、服务器端的缓存、数据库的缓存等。浏览器会缓存它浏览过的资源,包括网页、图片等数据。由于CPU处理缓存数据的运行速度比内存数据快得多,所以缓存的存在可以提高响应速度,减小服务器压力。
(2)缓存与数据库的对比
①范畴不同。所有具备持久化存储能力的机制,甚至包括可以直接读写的本地文件,你都可以说它是“数据库”。所有保存中间的、额外的数据的机制,你都可以说它是“缓存”。
②结构不同。数据库的存储方式严格且多样,而缓存通常是简单的“key-value”结构(key是关键字,value是关键字的值)的数据。
③处理速度不同。数据库是存在低速设备上的,每次访问数据库,都要经过“读/取”(I/O)过程,即从磁盘调入内存的过程,该过程是耗时、耗性能的。而访问缓存的速度非常快。从数据结构层面来说:缓存使用了异步非阻塞,使用了动态字符串,并采用了跳跃表。
④范围对比。缓存中有的数据,数据库中一定有。反之则不成立。缓存中存储的是一些请求频次比较高的数据,不是所有数据都会存储到缓存中。
2.Cookie和Session
倘若我们在电脑上使用账号、密码登录过某网站,那么下次进入该网站时通常会自动登录。这其实就是浏览器的Cookie和Session在起作用。这两者都是用来保存状态信息的,是为了解决HTTP无状态(即HTTP对前后请求没有任何识别能力)的问题而生的。比如用户登录一次,就会生成Session文件,保存到服务器中,并对应生成Session ID,保存到Cookie 文件中。Cookie文件是被保存在客户端中的,其可以在浏览器目录下被查询到。这样下次同一个用户在同一个用户端上登录时,就能够通过 Cookie文件中的Session ID,将登录资料调用出来。需要注意的是,如果浏览器禁用了Cookie,那么同时Session也会失效。
3.缓存、Cookie和Session三者的对比
缓存与 Cookie、Session 的主要差别在于:缓存的内容比后两者更广泛、数量更大,比如会话信息、秒杀商品、热点新闻、热门商品等需要频繁查询的信息,都会保存在缓存中。
图片
2.1.6 页面加载
1.页面加载的过程分析
用户打开一个页面,页面框架中的那些不需要加载的内容会先呈现出来,之后浏览器会逐步拉取服务器上的数据。这就是为什么当用户打开一个页面时,刚开始页面上的部分内容为空白,需要等待一会才能够载入。用户等待的时间主要花费在下载网页元素上,这些网页元素包括 HTML、CSS、JavaScript、Flash、图片等内容。每增加一个元素,网页载入的时间就会增加。以浏览器加载HTML页面为例,我们来简单看一下页面加载的整个过程。
(1)用户输入网址(假设用户第一次访问该网站),浏览器向服务器发出请求,服务器返回HTML 文件。
(2)浏览器开始载入 HTML代码。这时发现代码中的<;head>;标签内含有一个<;link>;标签,引用了外部的 CSS 文件,于是浏览器又发出 CSS文件请求,让服务器返回这个CSS文件,在获取该文件后,浏览器开始渲染页面。
(3)与此同时,浏览器继续载入HTML中的<;body>;标签部分的代码,发现其中有一个<;img>;标签引用了一张图片,于是向服务器发出请求。此时浏览器不会等到图片下载完毕,而会继续渲染后面的代码。
(4)服务器返回图片。由于图片占用了网页上的一定面积,影响了后面段落的排布,因此浏览器需要重新渲染这部分代码。
(5)这时候,如果用户按下界面中的“换肤”按钮,JavaScript 代码会让浏览器更换<;link>;标签中的 CSS 路径,浏览器会向服务器请求新的 CSS文件,然后重新渲染页面。
图片
按照此流程,浏览器来来回回地运行,不断将代码中的元素逐步加载出来。
2.加载速度的重要性
用户的耐心是有限的。假如用户访问你的网站但等待过久,他就会放弃访问。许多研究表明,用户最满意的打开页面时间在2秒以内。如果用户等待了12秒以上,网页还没有载入,那么99%的用户会关闭这个网页。Google曾经做过一个实验,当页面显示10条搜索结果时,其页面载入时间为0.4秒,当页面显示30条搜索结果时,其页面载入时间为0.9秒。当Google采用后面一个方案时,其流量和收入均减少了20%。这就是为什么在许多电商的后台管理系统中,默认加载数据条数是10条。
3.优化页面加载速度
随着技术发展,优化页面加载速度的办法有很多,常见的方案包括但不限于如下。
(1)减少文件请求次数用户在打开一个网页的时候,等待的时间主要花费在下载网页元素(比如HTML、CSS、JavaScript、Flash等内容)上了,所以要想提高网页打开速度,就要减少HTTP请求文件次数,有效的办法如下。
①合并文件:对于文本文件,可以直接合并其内容。例如,将多个JavaScript文件合并成一个,将多个CSS文件合并成一个。
②优化缓存:对于没有变化的网页元素(如页头、页尾等),当用户再次访问的时候没有必要重新下载,直接从浏览器缓存里读取就可以了。
(2)压缩网页元素网页中各个元素的体积越小,下载所需的时间就越少,因此要尽可能压缩文件。现在比较成熟和流行的压缩网页的方式,是使用 Gzip(一个文件压缩程序),一般可以让网页文本内容减少70%以上。
(3)将CSS文件放在网页的“head”标签中可以将CSS文件(样式表)移到网页的“head”标签中,可以让页面尽快开始渲染,这样用户所感受的载入速度将会变快。
(4)把JavaScript文件放到网页底部当网页被打开时,所有元素是按照顺序显示的。由于JavaScript文件的特殊性,其相比其他元素来说,会加载得很慢。在JavaScript文件下载完成之前,后面其他元素的显示将被阻塞。因此尽量把JavaScript文件放在网页底部。
(5)其他方法提升页面加载速度的方法还有很多,比如压缩组件、使用外部JavaScript和CSS文件、去掉不必要的插件、使用内容分发网络等。需要注意的是,努力提升页面加载速度的同时,也不能忽视交互响应的优化。对于用户来说,每次操作不管返回结果是慢还是快,网页都要及时响应,从而可以在一定程度上缓解用户等待网页加载的焦虑。
数据库相关知识
数据1.数据的概念数据,就是能够被智能设备(计算机、智能手机等)识别、存储和加工处理的信息的载体。在计算机系统中,各种文本、数字、语音、图形、图像等,统称为数据。数据经过加工后就成为信息。数据是计算机世界的运算对象,也是输出产物。2.数据类型数据类型,就是一组性质相同的值的集合,以及定义在这个值集合上的一组操作的总称。我们也可以这样理解:数据类型就是对具体数据或变量的约束和归类。每一种数据都有唯一的一个数据类型(需注意,变量也可以被指定为缺省类型)。数据类型的出现,一方面是为了把数据分成所需内存大小不同的种类(这样在编程的时候,只有在使用大的数据时才申请大内存,可以充分利用内存),另一方面是确定数据的属性(比如一个或一串字母可能代表不同的含义,需要对之加以定义,才可方便运用)。不同编程语言规定的数据类型不同,常见的数据类型有整型、字符串型、浮点型、布尔型等。
(1)整型整型变量表示的是整数类型的数据,其类型说明符一般为int。其常被分为长整型、短整型等。整形变量属于数字,因此是可以进行数学运算的。
(2)字符串型字符串型可以理解为文本型。该类型的值不能直接做数学运算,只能用于展示。字符串之间可以拼接。在Java语言中使用string表示字符串类型,在C语言中则使用char表示。字符串可以是任意内容,比如“12”。
(3)浮点型浮点型就是小数类型的数据,一般用float或double表示浮点型。比如,1.2是浮点型数字,23e2是科学计数法形式的浮点型数字。
(4)布尔型布尔型可以简单地理解为判断真假的类型,一般用bool或boolean表示。布尔型的值只有两个:false(假)和true(真)。需要注意的是,在写与数据相关的需求文档的时候,产品经理可以对数据库中的数据类型进行定义。如表2-3所示,在该需求文档中对数据的定义就包括“字段类型”这一列。
图片
数据结构
1.数据结构概念
数据结构,顾名思义,就是数据之间的结构关系。数据结构是对数据存储和组织方式的规范,是对现实中事件的运行结构或运行方式的模型化。在通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。比如,数据库的存入和读取就依赖数据结构。
2.数据结构的构成
数据结构包括三个方面的内容:数据逻辑结构、数据存储结构、数据运算。
图片
(1)数据逻辑结构
数据逻辑结构,反映的是数据元素之间的逻辑关系,与数据在计算机中的存储位置无关。数据逻辑结构,一般分为集合结构、线性结构、树状结构和图状结构四类。集合结构中的任何两个数据元素之间都没有逻辑关系,组织形式松散;线性结构中的结点按逻辑关系依次排列形成一个“锁链”,线性结构还可以划分为表、数组、队列、栈、串等结构;树形结构具有分支、层次特性,其形态有点类似于自然界中的树;图状结构中的结点按逻辑关系互相缠绕,任何两个结点都可以彼此邻接。
(2)数据存储结构
当我们处理数据之后,就需要存储数据,这涉及数据存储结构,即物理结构。数据存储结构有顺序、链接、索引、散列等多种。
(3)数据运算
数据运算就是基于数据结构进行的运算,其具体实现依赖于数据的存储结构。数据运算可以简单理解为,对已经存储好的数据进行增加、查找、编辑、删除等操作。数据运算是数据结构的一个重要方面。
(4)三者之间的关系
一种数据逻辑结构在计算机里可以用不同的数据存储结构实现,数据运算是基于数据逻辑结构和存储结构实现的,三者相辅相成。
3.常见的数据结构举例
(1)数组
所谓数组,就是有序的元素序列,即有限数量的类型相同的变量的集合。按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组等。
比如 char CHB[]={“1”,“2”,“3”}的结构,就是数组的表示方式,其含义就是定义CHB为字符串的一维数组,包含的值是字符串形式的“1”“2”“3”。这样就通过一个简单的组合形式,表达了一组有共性的数据。二维数组是一种简单的数据结构。
这个二维数组的结构与一张有行有列的表很像:每一行代表一个对象,每一列代表对象的一个属性。尽管二维数组很适合存储表数据,但是当你需要根据某个条件从数组中查询数据时,就要遍历每一行数据,而当数据量大的时候,这将花费许多时间,服务器性能就会变差。这时候就需要考虑使用其他数据结构。
(2)树结构
树结构是另一种重要的非线性数据结构。直观地看,它是数据元素(在树中被称为结点)按分支关系组织起来的结构。一切具有层次关系的问题都可用树结构来描述,比如家庭成员关系、页面各级菜单关系等。数据库索引是树结构的一个重要应用,索引可以提高数据库查询速度。常见的关系型数据库的索引使用的数据结构,多是 B+Tree 或者 B-Tree(二者都是树结构的一种),例如MySQL的索引使用的是B+Tree,Oracle和Sysbase的索引使用的是B-Tree。我们来了解一下为什么索引要使用树结构的存储方式来实现。我们都知道,数据库文件是存储在硬盘上的,每次读取数据库都需要在硬盘上搜索,而 B+Tree数据结构的查询方式不是遍历,而是从树根部对比着向下递推做二分查找,查询次数不会高于树的层数,所以查询速度更快。
图片
如果在该树结构中查找“208”节点,那么该数据的查找过程是按照如下方式进行的。
①从根节点(也就是“136”节点)开始查找。
②判断出 136<;208,所以在“136”节点的右子树中查找,找到“398”节点。
③判断出398>;208,所以在“398”节点的左子树中继续查找,找到“250”节点。
④判断出250>;208,所以在“250”节点的左子树中继续查找,找到“200”节点。
⑤判断出200<;208,所以在“200”节点的右子树中继续查找,然而“200”节点没有右子树,因此不可能找到“208”节点(如果其存在的话,一定在“200”节点的右子树上)。
结论就是:查找完毕,不存在“208”节点。
那么,如何从图中查找“40”节点呢?查找过程如下。
①从根节点“136”节点开始查找。
②判断出136>;40,所以在“136”节点的左子树中查找,找到“80”节点。
③判断出80>;40,所以在“80”节点的左子树中查找,找到“40”节点。
④判断出40=40,所以该节点找到了!提取“40”节点中存储对象的对应数组行号索引。有了这个行号索引,想获得这行数据就能立即拿到(具体实现的方式此处不做讨论)。
需要注意的是,树结构还有很多变种,比如“堆”结构就是一种特殊的树形数据结构。
(3)栈
栈也是一种重要的数据结构。它最大的特点是只能在某一端插入和删除。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始读数据(即最后一个数据被第一个读出来),出栈的顺序与入栈的顺序相反。这就像是一摞蒸笼,一层一层放入小笼包,而当把小笼包拿出来的时候只能从上往下进行。因此凡是遇到有这样逻辑需求的数据,就可以套用该数据类型。
图片
(4)队列
队列也是一种特殊的线性表。队列与栈相反,是按照“先进先出”和“后进后出”的原则组织数据的。当队列中没有元素时,被称为空队列。
图片
(5)其他数据结构
其他数据结构如散列表、图形结构等都是很重要的数据结构。单纯按照查询速度来看,在这几种数据结构中,数组和链表结构最慢,树结构较快,散列表最快。关于其他数据结构,本书不再具体介绍。2.2.3 数据模型1.数据模型的概念数据模型,是为了更好地描述一组数据的概念和定义,而对现实世界数据特征进行的抽象和模拟。在数据库中数据的存储方式依赖于数据模型。要想更有序、安全地把数据保存到数据库,并从数据库中高效读取,必然要创建成熟有效的数据模型。因此,数据模型是数据库系统的理论核心和基础。数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。
(1)数据结构数据结构的有关概念笔者在前面讲解过了。理论上数据模型可以使用任意的数据结构,但考虑到性能问题,就要做出不同选择。比如使用数组结构,在进行遍历操作时速度会相当快,但是在进行新增与删除操作时速度就稍差了。相比之下,如果使用链表数据结构,在进行新增与删除操作时,速度就快很多。
(2)数据操作数据操作主要定义了在相应的数据结构上的操作类型和操作方式。常见的数据操作是对数据库中的数据进行增加、删除、修改、查找等操作。删除和修改操作都是建立在查找操作的基础上的,所以完美的数据模型应该是具有较高的插入效率和查找效率的。
(3)数据约束数据约束主要用来描述数据库中数据结构之间的语法、词义联系以及彼此之间的相互约束和制约关系(比如MySQL使用外键保证数据之间的数据完整性)。
2.数据模型的种类
按不同的应用层次,数据模型分成三种:概念数据模型、逻辑数据模型、物理数据模型。
(1)概念数据模型概念数据模型(CDM)的抽象性最高,关注现实世界与数据世界的关系,不关注数据的底层细节,为构建逻辑数据模型奠定基础。概念数据模型必须换成逻辑数据模型,才能在数据库管理系统中实现。在概念数据模型中,最常见的是E-R模型、扩充的E-R模型、面向对象模型,以及谓词模型。其中E-R模型图就是实体联系模型(Entity Relationship Diagram),是用矩形框表示实体(比如“产品”是一个实体),用椭圆图框表示实体的属性(比如“产品名称”是产品的一个属性),用实心线段将属性与相应关系的实体连接起来,用菱形框表示实体之间的联系成因,在菱形框内写明联系名(比如“上架”是连接产品与销售网站的成因),并用实心线段分别与有关实体连接起来,同时在实心线段旁标上联系的类型。
图片
(2)逻辑数据模型逻辑数据模型(LDM)是直接面向数据库的逻辑结构,涉及计算机系统和数据库管理系统。这种数据模型架起了用户和系统之间的桥梁。在逻辑数据模型中,较常见的是层次模型、网状模型、关系模型,其中最常见的是关系模型,其对应的数据库被称为关系型数据库,如MySQL、DB2、Oracle等。
(3)物理数据模型物理数据模型(PDM)是在逻辑数据模型的基础上,考虑各种具体的技术实现因素及硬件因素,进行数据库体系结构设计,真正实现数据在数据库中的存储。因此物理数据模型的设计内容较为详细,包括数据库的存储过程、操作、触发、视图和索引表等。
2.2.4 数据库
1.数据库的概念
数据库是存储在计算机系统内的,结构化的、集成的、相关的、共享的、可控制的数据集合。数据库就是储存数据的仓库,只不过这个仓库的数据必须按照一定的格式存放,因为数据的存放必须便于数据的查找。可以这样理解:将数据按照一定的规则,结构化地储存在一个相当于磁盘的地方,这个地方就是数据库。数据库由数据库管理系统管理。数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。数据库管理系统具有存储、截取、安全保障、备份等基础功能。在诸多数据库中,最常见的是关系型数据库和非关系型数据库。
2.关系型数据库
(1)关系型数据库的概念
关系型数据库,是一种基于实体联系模型(如E-R模型)的数据库。世间万物都是通过实体与属性、实体与实体之间的关系折射出的关系模型。关系型数据库定义的就是实体与属性的集合。比如人有年龄、姓名等属性。关系型数据库有MySQL、Oracle、SQL Server、DB2、Informix等,其中最常见的是MySQL。由于MySQL使用类似二维表格的存储形式,因此其和页面报表的组合比较完美,搭配PHP和Apache可以组成良好的开发环境。此外,比较常见的关系型数据库还有Oracle,在数据量很大的时候,其非常有用。比如拥有千万量级以上数据的数据库,通常会使用Oracle。
(2)范式
提到关系型数据库,就不得不说范式。范式是数据库设计规范方面的一个概念,是围绕着关系型数据库而形成的规则和约束。范式有很多条,前三条范式是关系型数据库创建的基础。
①第一范式:每一列不能有重复的属性值第一范式(1NF)是指数据表中的每一列不能有多个值,换言之,每一列的属性的值都必须是不可再分的。如果实体中的某个属性有多个值,必须将之拆分为不同的属性。
②第二范式:每个行的数据不重复第二范式(2NF)和第三范式是容易混淆的。第二范式是在满足第一范式的前提下提出的,主要包含两点:其一,一个数据表必须有一个主键(主键是由一个或多个字段组成的,区分数据的唯一性,主键的概念会在下文继续讲到);其二,没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。如果不满足第二范式,容易产生冗余数据。
③第三范式:即直接性,数据表的每一列都要和主键直接相关,而不能间接相关。第三范式(3NF)要求数据表中不能存在“非主键列 A 依赖于非主键列 B,而非主键列 B 依赖于主键”的情况。比如,有一个“爸爸信息表”,里面的属性有:爸爸、儿子、女儿、女儿的小熊、女儿的气球,这就不符合第三范式,因为“爸爸”与“女儿的小熊”“女儿的气球”都不是直接的相关。在这种情况下,需要将其改成两个表。其一是“爸爸信息表”,包含属性:爸爸、儿子、女儿;其二是“女儿信息表”,包含属性:女儿、女儿的小熊、女儿的气球。
3.非关系型数据库
对于大量的半结构化数据和非结构化数据,人们针对其存储、并发以及扩展能力而设计出了非关系型数据库,像Google的Bigtable、Amazon的Dynamo,以及Apache的Hbase等。非关系型数据库是松散的、无严格结构规范的,被称为 NoSQL,是传统关系型数据库的有效补充,用于对存储要求高、并发处理较多的场合。常见的非关系型数据库有MongoDB、HBase等,它们以键值对(key-value)的形式存储,是类似JSON的格式,因此可以存储比较复杂的数据类型。非关系型数据库的存储形式如下。
在非关系型数据库中,MongoDB 是最著名的,其功能非常丰富,最大的特点是其支持的查询语言非常强大,有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。非关系型数据库都是针对某些特定的应用场景而设计的,因此该类数据库往往具有极高的选择性和强大的性能。
2.2.5 常用的关系型数据库管理系统:MySQL
1.MySQL的简介
(1)MySQL的特点
MySQL 是最流行的关系型数据库管理系统之一,其将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了查询速度并提高了灵活性。MySQL 数据库的存在,使得变量的增加、删除、修改、查找操作只需在数据库层面完成即可,不用到代码层面处理,既安全又高效。由于其体积小、速度快、总体拥有成本低,尤其是其开放源码,使得一般中小型网站的开发,都使用MySQL作为数据库管理系统。初学者学习数据库往往都是从学习MySQL开始的。
(2)MySQL的安装
2.MySQL的数据库、数据表、应用程序等之间的关系
(1)MySQL的结构关系MySQL 数据库管理系统可以管理多个数据库,每个数据库可以创建很多个表,每个表描述一种实体与多个属性的关系,每个属性就是一个字段,每个字段有不同的取值。
图片
(2)数据库与应用程序之间的关系
数据库与数据库之间可以交换信息,数据库与应用程序之间也可以交换信息。
图片
3.MySQL拆表存储
理论上,每个实体至少对应一个数据表,表中的字段就是实体的属性或衍生属性,但是实际上一个实体的属性往往被拆分到多个数据表中存储。在这种情况下,一旦需要查询,就要通过联表才能完成。既然联表很麻烦,那么为什么非要拆表存储呢?其实这和前面提到的范式有很大关系。在实际情况中,一个实体所具有的属性会有很多,如果将所有属性放入一个表中,那么其产生的数据表往往也就包含很多信息。当这个数据表中的数据量很大的时候,其缺陷就非常明显:首先是数据冗余,其次是维护(比如编辑)困难。因此庞大的数据表要分表存储,该理念和第二范式的思想是一致的。例如有一个描述用户发布消息的表,每当用户发表一条消息,就需要把他的昵称、性别、姓名、消息等数据都插入到表中,这样一条一条数据累积下去,如果在未来的某一天里,用户突然修改自己的昵称,那么我们要遍历整张表,去更新他的每条数据中的昵称。在这种情况下,修改是不现实的,所以就需要把原来的表中的用户信息和消息信息分别存储。拆表之后,通过姓名就可以查到用户的个人信息,又可以通过用户的 ID 查到他发出的所有消息。
4.数据表
(1)数据表的基本信息数据存储于数据表中,数据表中每一条基本的数据都由数据类型、字段(也叫变量或者参数)、字段值等组成。以下面的数据表结构信息(局部)为例。
图片
该部分内容表达的主要信息如下。
①表名是“s_rule”。
②各个字段都有默认值,比如“rule_type_id”的默认值为“0”。
③各个字段都不允许为空值。
④规定了各个字段的数据类型,比如“rule_id”的数据类型为11位整数。
⑤各字段带有注释,比如“rule_id”的注释为“主键ID”。
(2)数据表的主键和外键
①主键
MySQL的每张表只能有一个主键(前面谈范式的时候提到过)。主键即主关键字,可以由一个或多个字段组成,并且主关键字的列不能包含空值。一般使用该表的 ID做主键。主键的最大特征是其具有唯一性,即由主键标示的各行数据不重复。主键主要用于和其他表进行外键关联,以及对本表的修改与删除。当两个表需要进行关联时,主关键字用于在一个表中引用来自另一个表中的特定记录。
②外键
如果表A的主关键字也是表B中的字段,则该字段称为表B的外键。表A称为主表,表B称为从表。外键可以保持数据一致性、完整性,使两张表形成关联。
图片
(3)数据表的索引
①索引的概念
索引是由开发人员用代码创建的,对数据库表中的一个或多个字段值进行排序的一种结构。数据库索引好比是一本书的目录,能提升数据库的查询速度。
如果“id”没有做索引,这个查询操作就必须遍历整个表,直到找到“id”等于“44”的这一行为止;如果“id”做了索引,则直接在索引表里找出“id”等于“44”,就可以直接得知这一行的位置,更快找到这一行。
②索引不能太多
索引有助于提高查询速度,但不是越多越好。
第一,创建和维护索引需要开发人员写代码,其耗费的时间随着数据量的增加而增加。
第二,当对表中的数据进行增加、删除和修改的时候,索引也要进行动态的维护,这样就增加了维护的成本。
第三,索引需要占用物理存储空间。因此,一个数据表的索引不宜过多,建议最多5个。索引不可能满足所有的场景,但是可以满足绝大部分的场景。
5.数据库相关需求方案的注意事项
后端产品的很多产品需求方案都会涉及数据表的创建、联表查询等,因此在需求方案设计的过程中要注意如下一些细节。
(1)建表的时候可以增加预留字段。因为当数据量大的时候很难再增加新字段,所以数据增长较快的表一定要预留几个字段的空位,便于日后数据表的扩展。
(2)当一个表无法再加字段的时候,可以增加扩展表。一般以原表的表名加上后缀“_ext”作为扩展表的表名,两个表通过原表 ID 进行关联。比如原表的表名为“order_goods_shipping”,其扩展表的表名就可以用“order_goods_shipping_ext”。
(3)对数据表新增字段的时候,要考虑该表已有数据的初始化处理。比如,将历史数据对应该新字段的值,全部初始化为空字符串或某一个默认值。
图片
(5)命名要规范,具体的规范举例如下。①库名、表名、字段名、索引名,统一使用小写字母、数字,必要的时候,以下画线连接,比如“订单商品数据表”可以命名为“order_goods_table”。②库名、表名、字段名加起来不要超过30个字符。③库名、表名、字段名不要单独使用数据库的常用关键字,像“lock”“time”“date”“return”“user”等,可以加前、后缀,比如“sale_date”。④命名不能使用特殊字符,如“%”“-”等。(6)产品经理在了解数据库之后,设计方案的思路会清晰许多,但是最终的方案还是由开发人员
综合评定的。如果产品经理将一些字段、表名等内容写进方案的话,要谨慎核实,并和开发人员做好沟通。2.2.6 使用基本的SQL语言进行数据库查询1.数据库查询介绍SQL是结构化查询语言(Structured Query Language)的缩写,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统,同时也是数据库脚本文件的扩展名。SQL 是数据库通用的操作语言(不同版本存在着细微差异),语句很简单,运算速度很快,是最重要的关系型数据库操作语言,并且它的影响已经超出数据库领域,在其他领域(比如人工智能领域的数据检索)也受到重视和采用。2.基础SQL语句举例(1)数据查询语句①基础的查询语句对产品经理来说,数据查询语句是比较简单的,也是使用次数最多的。最基本的查询语句是“SELECT+目标字段+FROM+表名”,表示从表中查询数据的目标字段。例子如下。
图片
如果同时查询多个字段,则目标字段之间用“,”隔开。例子如下。
图片
如果查询全部字段,则用“*”代替具体的字段。②配合函数查询SELECT语句配合函数可以满足更多需求。常用的函数包括但不限于如下。COUNT():统计记录数。例子如下。
图片
AVG():计算字段值的平均值。例子如下。
图片
SUM():计算字段值的总和。例子如下。
图片
MAX():查询字段的最大值;MIN():查询字段的最小值。例子如下。
图片
③配合筛选条件查询基本的筛选条件用“WHERE”连接,句式为“SELECT+目标字段+FROM+表名+WHERE+条件”。例如,我们要从“学生表”中查询年龄为14岁的学生的姓名,代码如下。
图片
④对查出的结果排序基本的排序用“ORDER BY”表示,句式为“SELECT+目标字段+FROM+表名+ORDER BY+排序字段+DESC/ASC”。例如,我们要从“学生表”中查询学生的全部信息,并按照年龄降序排列,代码如下。
图片
⑤对结果分组用“GROUP BY”语句进行分组,例子如下。
图片
⑥字段拼接输出用“CONCAT”可以拼接多个字符串。例如,我们要将employee_tbl表中的用户年龄、姓名、工作日等连接在一起,代码如下。
图片
⑦联表查询联表查询的句式为“左表+JOIN+右表+ON+关系字段”。在具体应用中,JOIN往往与前缀结合,比如“INNER JOIN”表示内联接,即查找两张表共同拥有的字段;“LEFT JOIN”叫左联接,以左表(“JOIN”前的那张表)为主,如果右表有共同字段,则一并返回,如果没有,则为空;另外还有“FULL JOIN”“RIGHT JOIN”等。例子如下。
图片
注意,在该例句中,“order_table a”意为:用“a”来代表“order_table”。⑧其他常用的SQL查询语句。
图片
(2)数据表的更改
3.SQL使用注意事项
(1)提升查询速度
①查询时,尽量只列出需要查询的字段,不建议查询全部,以避免影响查询速度。
②尽量避免进行全表扫描。如果我们只需要返回一条结果,可以使用“LIMIT 1”指令,能够提高效率。
(2)在某些情况下索引无法被使用
①SQL 中的“OR”指令表示并列关系,比如“WHERE customer_id='250’oramount=3.96”。用“OR”分割开的条件,若其前面的条件有索引,后面的条件没有索引,那么前面的索引也不会被用到,该查询仍是要进行全表扫描的。
②负向查询不会使用索引,比如“NOT”“NOT IN”“NOT LIKE”“<;>;”“!=”“!=”“!<;”等。例如,下面的代码不会使用索引。
(3)MySQL中的NULL和空字符串在SQL语句中,NULL通常指的是不适用的、无意义的、无效的、不存在或之后将要加入的数据,而空字符串(‘’)表示该字符串的值就是空(注意空字符串的单引号之间是没有空格的)。比如,电话号码字段是NULL的时候,可理解为“该人员是否有电话号码是未知的”;而用空字符串表示的话,就可理解为“该人员没有电话号码”。在SQL语句中,判断NULL的SQL语句应该使用is NULL或者is not NULL,但判断空字符串则应使用“=”或者“<;>;”。比如一条数据的A字段值为NULL,此时使用关键查询条件“A is
NULL”,是可以查出该条数据的;但是关键查询条件使用“A=‘NULL’”,就查不到该数据。
2.3 系统间数据对接在后端产品的世界里,各个子系统之间的对接或者子系统与外部系统之间的对接非常常见。对接的本质是为了实现数据信息的传输。很多后端产品的需求都是跟系统间数据对接有关的,所以作为后端产品经理,要了解系统间数据对接的方式,以及通过对接获取数据信息后的运算逻辑、异常机制等。
2.3.1 系统间数据对接的场景和注意事项
1.系统间数据对接的场景
系统间数据对接,就是指在系统与系统之间搭建数据信息交互渠道。后端产品系统之间的数据对接很常见,可以分为与外部系统对接和与内部系统对接两类。与外部系统对接通常是和第三方系统对接;与内部系统对接通常是企业内部各个子系统之间的对接。系统间数据对接的场景,包括但不限于如下几种。
(1)前端产品和后端产品之间的信息调用比如,某电商网站作为前端产品,其管理后台维护基础数据“商品价格”,该电商网站用户刷新商品信息,则通过调取其“商品价格”获取数据,实现整体功能的闭环。这就是前端产品和后端产品之间的信息调用。
(2)企业内部各个子系统之间的信息共享在分布式系统部署情况下,各个系统模块需要各司其职,同时又相互配合,比如订单系统的库存扣减数据,要同步给备货系统,以作为采购的依据。
(3)与第三方系统的对接举个例子,商家在入驻第三方销售平台之后,可能需要管理自己的订单,这时候就要从第三方销售平台上获取订单的原始数据。
(4)调用现成的功能插件市场上有很多开放性的功能插件可以调用,比如视频网站可以接入腾讯云的美颜SDK,这样可以避免重复“造轮子”,提升研发效率和性能保障。
2.系统间数据对接的注意事项
系统间数据对接往往是双方或多方系统协作完成的,涉及对接方案选型、联调测试等环节,因此系统间数据对接的逻辑比较复杂、相关人员较多、实现周期较长。进行系统间数据对接时需要注意或考虑的事项包括但不限于如下几点。
(1)系统间的耦合性
对接方案要使系统间的耦合性尽量最小。这样对接之后,单边系统发生变化,对另一系统的影响最小,这也符合高内聚低耦合的指导思想。
(2)尽量进行较小的改动
当进行系统对接时,尽量要求参与对接的系统及功能的代码改动最小,以免出现更多次生风险。
(3)技术选择
不同的技术涉及不同的软硬件的支持,开发成本也有所不同,因此要从公司的硬件配置、安全等级、技术储备等方面综合考虑技术方案。
(4)考虑时效性
当一个系统将数据传递给另外一个系统的时候,需要判断双方对时效性的要求。如果双方对时效性要求都不高,那么可以采用异步交互的方式。异步交互可以缩短逻辑链条、降低逻辑复杂度、减轻服务器压力。
(5)可靠性系统
对接的目的是完成数据的交互,从本质上来说就是实现系统之间的通信,所以要保证系统间通信数据的准确一致,减少丢包等事故的发生。因此,产品经理不仅要设计正向的方案,还要考虑异常机制、备用方案、风险监控等,以提高可靠性。
2.3.2 系统间数据对接的方式
系统间数据对接是为了实现数据信息的传输。系统间数据传输的方式主要有:接口传输、数据库传输、文件共享传输、消息队列方式传输等。
1.接口传输
(1)接口简介接口是指一些预先定义的函数,是不需要访问源码或理解内部工作机制的细节即可调用的对象。接口是一种传统的问答式的传输方式,相当于请求方与应答方之间的信息通道。目前我们常用的HTTP调用接口、Java远程调用接口等,都属于这种方式,不同的只是传输协议及报文格式。对后端产品来说,HTTP接口的使用场景很多。比如公司先上线了OA系统,后上线了订单管理系统,订单系统需要同步OA系统的人员组织关系信息,这时候就需要OA系统创建一个HTTP接口,让订单系统请求该接口,以此实现信息同步。
(2)哪一方负责创建接口?在讨论接口方案的时候,需要先确认在哪一方系统中创建接口。有时候产品经理只知道需要创建接口,却不知道在哪个系统中创建接口。可以这样理解,如果把数据源看成一缸水,那么接口就像是在缸上凿出的一个口,所以接口必须是在被请求的数据源这边的,即由被请求的一方创建接口。注意,这里的数据源是相对的,换言之,被请求的一方就是数据源方。实际上,目标数据也可能在请求方一边。比如,在上面的例子中,也可以是OA系统请求订单系统,但是如果是这样的话,接口就是由订单系统创建的了。
(3)什么是定义接口还拿水缸打比方,定义接口其实就是定义缸上的出水口的大小、滤网、放水的频率等,就是定义规则。这些规则约定了哪些数据是需要流过去的,以及流过去的条件等,就像门禁密码一样。定义接口包括设定口令、数据范围、推送前的筛选、转化运算规则等,是接口的核心内容,由开发人员在代码中实现。
(4)数据的预处理在某些时候,数据从源头到终端不是原封不动的,而是经过了处理的。比如“考试系统”中存储的学生考试成绩是具体的分数,比如80分、90分、50分等,但是“证书颁发系统”只需要知道两个信息:及格或不及格。那么在前者为后者提供数据的时候,就可以对数据做预处理,将具体分数对应处理为及格或不及格,再将结果发到后者。这里就涉及,究竟是在接收方接收数据之前进行预处理,还是在接收方接收数据之后由接收方自行转化的问题。在接收数据之前进行预处理的好处是可以让流转的数据变得简单直接;在接收数据之后再转化的好处就是安全。一般来说,如果数据被接收之后还会被二次使用,那就直接接收原数据。需要注意的是,数据在被转化之后,其数据量不一定会减少,比如数据源是订单维度的,而目标是将之转化为“订单+商品”维度的数据,这就可能令一条数据变成多条数据。
(5)是主动获取,还是等对方推送。
有时候开发人员还会询问:数据是由对方推送,还是由我方主动去取。这就涉及接口的POST/GET方式问题。GET是指从服务器方请求数据,POST是指向服务器方传送数据。前面也提到了,接口交换数据可以通过主动推送,也可以通过请求获取。主动推送时,数据生产方的数据一旦更新,就会触发推送,将所需字段的对应值传递过去;请求获取时,数据需求方会传递请求参数(一般是若干条件,比如“账号+密码”)给数据生产方,数据生产方收到后则按照协议响应,将满足条件的数据发给请求方(也就是返回参数)。可以看出,如果对数据的时效要求高,则建议采取数据生产方主动推送的方式。如果对时效要求不高或者数据量巨大,则可以采取由需求方按一定频率主动请求的方式。在具体使用场景中,如果对接的系统比较多,那么建议做一个公共接口,以后哪个系统想用,就由该系统自己来请求接口,避免麻烦和风险。另外,从安全角度看:GET请求的数据是使用URL地址明文发送的,不安全;POST 的请求数据不会在地址栏中出现,相对较为安全。从传输的数据量来看:GET指令有数据量限制,而POST指令没有限制。
(6)总结接口的特点优点:
①可以触发式实时问答,确保时效性;
②通用性比较强,应用广泛;
③容易控制权限;
④通过传输层协议HTTPS(超文本传输安全协议)加密传输数据,可以使安全性提高。
缺点:
①数据提供方(服务器)和接收方(客户端)必须同时工作,当服务器端不可用时,整个数据交互就不可进行;
②当传输数据量比较大的时候,严重占用网络带宽,可能导致连接超时。2.数据库同步数据库同步实际就是将一个数据库中的数据共享给另一个数据库,是数据表对数据表的共享,多发生在企业内部系统之间。数据库同步有以下几种办法。
(1)使用中间库举个例子。B系统要使用A系统的数据,可以新建一个数据表D,A系统将数据处理后写入数据表D,B系统再到数据表D中读取数据。这种方法是将目标数据放进一个中间表中,A、B 两个系统都对这个表有访问权限。该方法的好处就是可以选择性地将一大批数据共享出去。
(2)直接获取对方数据表的数据如果 B 系统在开发时,直接在代码中调用 A 系统的数据表,从数据表中获取数据。这种方法可以实时拉取A系统的数据,B系统不需要在本地做表保存,比较省事,但是耦合性较大,数据量大或业务复杂的时候不建议使用。(3)实时同步对方的数据表要想直接与对方的数据表保持数据同步,使用Otter是一个常用的方法。Otter是阿里开源的一个分布式数据库同步系统,尤其是在跨机房数据库同步方面,有很强大的功能。它是基于数据库增量日志解析,实时将数据同步到本机房或跨机房的MySQL/Oracle数据库。
使用Otter方法需要数据库工程师协助配置,也就是需要做一个数据库同步平台,定义相应的映射规则。Otter进程会根据定义的规则,将数据表的内容从源头数据库更新到目标库中,同时支持双向更新。
图片
该方法主要用于公司内部系统之间数据库对数据库的传输,可以实现数据的实时同步更新,建议应用在数据量大的场景下。该方法的优点是占用资源少,交互更加简单可靠。
3.文件包共享方式
一些第三方公司为了保密,不愿意提供接口,会把文件保存在网盘或网页上,供需求方下载。双方的系统约定文件共享服务器地址、密码、文件命名规则、文件内容格式等,通过上传文件到文件服务器,进行数据交互,该方式在较大数据量的场景下也适用。该方式是一种异步上传、下载机制,将双方的操作割裂开,文件一旦上传,可以长久保存,被多个需求方使用。文件包共享方式的同步数据工作原理如图2-19所示。
图片
比如第三方支付公司与需求方约定好了SFTP服务器(一种文件服务器,可以理解为网盘)的账号密码,然后第三方支付公司将账单数据上传到SFTP服务器上,需求方就可以登录SFTP客户端,进行下载、解析,然后保存使用。这也实现了数据在服务器之间的传输。
4.消息队列
消息队列(MQ)技术是分布式应用之间交换信息的一种技术。简单说就是一方不断地把信息推到队列中,像排队进隧道一样,另一方依次消费这些信息。消息队列可驻留在内存或磁盘上,直到被应用程序读取。目前市场上有很多开源的消息队列服务,比如ActiveMQ、OpenJMS。
图片
该方式适用于公司内部进行的数据量大的、规律性强的、批量交换的数据,主要解决应用解耦、异步消息、流量削峰等问题。在设计方案的时候要注意设置异常情况的处理机制。比如系统第一次消费某条数据的时候失败了,但是下次又想再消费一次,在这种情况下,可以设置机制:将消费失败的信息插到队列后面继续推送。在某些情况下,如果系统一直消费不掉某些信息,久而久之就会造成消息积压,在这种情况下,可以设置规则,当积压数据超过一定数量或者循环时间过长时进行报警,由人工参与处理。2.3.3 数据对接的相关机制
通过选择系统间对接方式,可以确定获取对方数据信息的渠道,但具体的实现机制和注意事项,需要根据具体场景而定。
1.使用触发式和定时任务方式
获取数据前面提到了数据获取的方式,可以通过操作事件触发。比如用户点击“买火车票”按钮,则立即触发系统进行车票抢占,并及时返回结果给用户。这种使用场景对信息时效性要求比较高,因此采用触发式实时传输。但问题就是,如果操作者多,会增加车票系统负荷,出现页面反应慢甚至卡死等不良的用户体验。如果使用场景对时效要求不高,比如买家提交商品购买订单之后,卖家并不需要立即执行发货,而是可以集中在晚上或其他某个时间统一发货,类似这样的业务模型就可以采用定时任务方式获取数据。定时任务在后端产品设计中是很常用的,通常就是建立起一个脚本,然后将之布置到定时任务管理系统上,按一定频率到数据生产方查询满足条件的数据,并进行数据推送或者拉取操作。
使用定时任务方式可以从增量数据中查询满足条件的数据,比如设定“每次获取6小时内更新的数据,获取频率为6小时一次”(设置时间间隔时应注意避免有时间段被遗漏)。也可以从全量数据中查询,比如定义表字段“is_got”为“是否已获取”,初始值为否,每次获取表中“is_got”为否的数据。注意,在这种方案下,“is_got”是要做表索引的,这样每次遍历数据库的时候才不会影响运算速度。
2.数据获取和应用是否异步执行
上文提到的“触发式和定时任务方式”是获取数据时候的机制,那么在获取之后,在写入或应用数据的时候,也可以设置适合的机制。一般而言,如果在获取数据后还要在本地进行规则运算或数据处理,那么最好先落地到本地的中转表中,再由中转表写入最终表或参与运算,也就是将数据的获取和应用异步进行。
图片
举个例子。假设有需求:按照“订单+包裹号”维度,从物流系统提取包裹的运费数据到财务系统中,然后再由财务系统将该运费分摊到该包裹的商品上面,算出每个商品分摊的运费金额。如果采用“从获取数据到分摊运算一步完成”的方式的话,那么一旦初始数据不准确或者算法中有BUG,就会导致结果出错,再想要追查错误原因并修复数据,就需要追溯到数据生产方,耦合性和复杂程度就很高。所以对这种含有复杂运算的场景,建议采用异步机制,即在进行分摊之前,先让数据落地到财务系统的中间表中,待获取数据完成,再启动第二个独立的机制,进行运费分摊并最终写入。总的来说,异步处理数据的获取和应用,有如下好处:一方面方便追溯异常问题,另一方面减少系统或功能之间的关联,并且将获取的数据存入本地,也可以被其他功能调用,增加数据的应用范围。如果获取的数据量非常大(达到万级以上),或者数据运算逻辑复杂,那么只要时效性允许,建议采用异步机制。
3.判重机制数据通道
搭建好之后,系统间的数据流往往是持续的。由于各种原因,同一条数据常常会被多次获取。在这种情况下,是新插入该数据然后覆盖原数据,还是更新旧数据呢?在确定这个机制之前,首先要确定表关键字,即确定若干字段作为判断重复的标准。比如,职工信息表的字段包括:姓名、手机号、性别、家乡、身份证号。在这几个字段中,身份证号对于一个职工来说是唯一的,因此如果我们更新其数据,就以身份证号为唯一标识。当获取数据库不存在的身份证号码时,则插入该数据;当获取到的身份证号在数据库中已经存在而手机号不同时,就可以更新数据库中该数据的手机号。注意,若改变了表的去重字段,则需要考虑新数据对历史数据的影响,因为二者的判重维度不一样,可能会获取和以前的历史数据冲突而又不被新的判重规则识别的数据。4.记录数据获取日志在从其他系统获取数据的过程中,一般都要创建数据日志,来记录数据的来龙去脉,以便追溯。数据对接的日志要重点记录三个事项:数据提供方是否提供了该数据、数据接收方是否接收到该数据、数据接收方是否写入了该数据。在设定数据对接日志的时候,需要告知开发人员是否将日志数据存到本地数据库中,因为开发者后台本身是有一个系统运作记录(Server Log)的,只是保存时间不会太长(比如一个月后就会被清除了),因此如果需要保留更长的时间,则可以将其保存到本地数据库。
929

被折叠的 条评论
为什么被折叠?



