精华内容
下载资源
问答
  • 有三个词,这两年出现的频率越来越高:人工智能(AI),机器学习(ML),深度学习(DL),到底他们哥仨是什么关系?今天小编化繁为简,用几张图带你迅速看明白。关系如图,从提...

    640?wx_fmt=gif

    有三个词,这两年出现的频率越来越高:人工智能(AI),机器学习(ML),深度学习(DL),到底他们哥仨是什么关系?今天小编化繁为简,用几张图带你迅速看明白。关系如图,从提出概念的时间上来看也很清楚:

    640?wx_fmt=jpeg

    人工智能AI:模拟人脑,辨认哪个是苹果,哪个是橙子。

    640?wx_fmt=gif

    机器学习ML:根据特征在水果摊买橙子,随着见过的橙子和其他水果越来越多,辨别橙子的能力越来越强,不会再把香蕉当橙子。

    机器学习强调“学习”而不是程序本身,通过复杂的算法来分析大量的数据,识别数据中的模式,并做出一个预测--不需要特定的代码。在样本的数量不断增加的同时,自我纠正完善“学习目的”,可以从自身的错误中学习,提高识别能力。

    640?wx_fmt=gif

    深度学习DL:超市里有3种苹果和5种橙子,通过数据分析比对,把超市里的品种和数据建立联系,通过水果的颜色、形状、大小、成熟时间和产地等信息,分辨普通橙子和血橙,从而选择购买用户需要的橙子品种。

    1、机器学习简史

    哲学上的三大终极问题:是谁?从哪来?到哪去?用在任何地方都是有意义的。

    ——尼古拉斯·沃布吉·道格拉斯·硕德

    虽然人工智能并不是最近几年才兴起的,但在它一直作为科幻元素出现在大众视野中。自从AlphaGo战胜李世石之后,人工智能突然间成了坊间谈资,仿佛人类已经造出了超越人类智慧的机器。而人工智能的核心技术机器学习及其子领域深度学习一时间成了人们的掌上明珠。面对这个从天而降的“怪物”,乐观者有之,悲观者亦有之。但追溯历史,我们会发现机器学习的技术爆发有其历史必然性,属于技术发展的必然产物。而理清机器学习的发展脉络有助于我们整体把握机器学习,或者人工智能的技术框架,有助于从“道”的层面理解这一技术领域。这一节就先从三大究极哲学问题中的后两个——从哪来、到哪去入手,整体把握机器学习,而后再从“术”的角度深入学习,解决是谁的问题。(本来想加个纵时间轴,无奈查了半天没找到方法,如果有人知道,求分享)


    640?wx_fmt=jpeg


    图一 机器学习发展史(图片来源:Brief History of Machine Learning)


    1.1 诞生并奠定基础时期


    1949, Hebb, Hebbian Learning theory

    赫布于1949年基于神经心理的提出了一种学习方式,该方法被称之为赫布学习理论。大致描述为:

    假设反射活动的持续性或反复性会导致细胞的持续性变化并增加其稳定性,当一个神经元A能持续或反复激发神经元B时,其中一个或两个神经元的生长或代谢过程都会变化。

    Let us assume that the persistence or repetition of a reverberatory activity (or “trace”) tends to induce lasting cellular changes that add to its stability.… When an axon of cell A is near enough to excite a cell B and repeatedly or persistently takes part in firing it, some growth process or metabolic change takes place in one or both cells such that A’s efficiency, as one of the cells firing B, is increased

    从人工神经元或人工神经网络角度来看,该学习理论简单地解释了循环神经网络(RNN)中结点之间的相关性关系(权重),即:当两个节点同时发生变化(无论是positive还是negative),那么节点之间有很强的正相关性(positive weight);如果两者变化相反,那么说明有负相关性(negative weight)。


    1950, Alan Turing, The Turing test

    640?wx_fmt=jpeg

    图二 图灵测试(图片来源:维基百科)

    1950年,阿兰·图灵创造了图灵测试来判定计算机是否智能。图灵测试认为,如果一台机器能够与人类展开对话(通过电传设备)而不能被辨别出其机器身份,那么称这台机器具有智能。这一简化使得图灵能够令人信服地说明“思考的机器”是可能的。

    2014年6月8日,一个叫做尤金·古斯特曼的聊天机器人成功让人类相信它是一个13岁的男孩,成为有史以来首台通过图灵测试的计算机。这被认为是人工智能发展的一个里程碑事件。


    1952, Arthur Samuel, “Machine Learning”

    640?wx_fmt=jpeg

    图三 塞缪尔(图片来源:Brief History of Machine Learning)

    1952,IBM科学家亚瑟·塞缪尔开发了一个跳棋程序。该程序能够通过观察当前位置,并学习一个隐含的模型,从而为后续动作提供更好的指导。塞缪尔发现,伴随着该游戏程序运行时间的增加,其可以实现越来越好的后续指导。通过这个程序,塞缪尔驳倒了普罗维登斯提出的机器无法超越人类,像人类一样写代码和学习的模式。他创造了“机器学习”这一术语,并将它定义为:

    可以提供计算机能力而无需显式编程的研究领域

    a field of study that gives computer the ability without being explicitly programmed.


    1957, Rosenblatt, Perceptron

    640?wx_fmt=jpeg

    图四 感知机线性分类器(图片来源:维基百科)

    1957年,罗森·布拉特基于神经感知科学背景提出了第二模型,非常的类似于今天的机器学习模型。这在当时是一个非常令人兴奋的发现,它比赫布的想法更适用。基于这个模型罗森·布拉特设计出了第一个计算机神经网络——感知机(the perceptron),它模拟了人脑的运作方式。罗森·布拉特对感知机的定义如下:

    感知机旨在说明一般智能系统的一些基本属性,它不会因为个别特例或通常不知道的东西所束缚住,也不会因为那些个别生物有机体的情况而陷入混乱。

    The perceptron is designed to illustrate some of the fundamental properties of intelligent systems in general, without becoming too deeply enmeshed in the special, and frequently unknown, conditions which hold for particular biological organisms.

    3年后,维德罗首次使用Delta学习规则(即最小二乘法)用于感知器的训练步骤,创造了一个良好的线性分类器。


    1967年,The nearest neighbor algorithm

    640?wx_fmt=jpeg

    图五 kNN算法(图片来源:维基百科)

    1967年,最近邻算法(The nearest neighbor algorithm)出现,使计算机可以进行简单的模式识别。kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。这就是所谓的“少数听从多数”原则。


    1969, Minsky, XOR problem

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    图六 XOR问题,数据线性不可分

    1969年马文·明斯基提出了著名的XOR问题,指出感知机在线性不可分的数据分布上是失效的。此后神经网络的研究者进入了寒冬,直到 1980 年才再一次复苏。

    1.2 停滞不前的瓶颈时期

    从60年代中到70年代末,机器学习的发展步伐几乎处于停滞状态。无论是理论研究还是计算机硬件限制,使得整个人工智能领域的发展都遇到了很大的瓶颈。虽然这个时期温斯顿(Winston)的结构学习系统和海斯·罗思(Hayes Roth)等的基于逻辑的归纳学习系统取得较大的进展,但只能学习单一概念,而且未能投入实际应用。而神经网络学习机因理论缺陷也未能达到预期效果而转入低潮。

    1.3 希望之光重新点亮


    1981, Werbos, Multi-Layer Perceptron (MLP)

    640?wx_fmt=jpeg

    图七 多层感知机(或者人工神经网络)

    伟博斯在1981年的神经网络反向传播(BP)算法中具体提出多层感知机模型。虽然BP算法早在1970年就已经以“自动微分的反向模型(reverse mode of automatic differentiation)”为名提出来了,但直到此时才真正发挥效用,并且直到今天BP算法仍然是神经网络架构的关键因素。有了这些新思想,神经网络的研究又加快了。

    在1985-1986年,神经网络研究人员(鲁梅尔哈特,辛顿,威廉姆斯-赫,尼尔森)相继提出了使用BP算法训练的多参数线性规划(MLP)的理念,成为后来深度学习的基石。


    1986, Quinlan, Decision Trees

    640?wx_fmt=jpeg

    图八 决策树(图片来源:维基百科)

    在另一个谱系中,昆兰于1986年提出了一种非常出名的机器学习算法,我们称之为“决策树”,更具体的说是ID3算法。这是另一个主流机器学习算法的突破点。此外ID3算法也被发布成为了一款软件,它能以简单的规划和明确的推论找到更多的现实案例,而这一点正好和神经网络黑箱模型相反。

    决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。

    在ID3算法提出来以后,研究社区已经探索了许多不同的选择或改进(如ID4、回归树、CART算法等),这些算法仍然活跃在机器学习领域中。

    1.4 现代机器学习的成型时期


    1990, Schapire, Boosting

    640?wx_fmt=jpeg

    图九 Boosting算法(图片来源:百度百科)

    1990年, Schapire最先构造出一种多项式级的算法,这就是最初的Boosting算法。一年后 ,Freund提出了一种效率更高的Boosting算法。但是,这两种算法存在共同的实践上的缺陷,那就是都要求事先知道弱学习算法学习正确的下限。

    1995年,Freund和schapire改进了Boosting算法,提出了 AdaBoost (Adaptive Boosting)算法,该算法效率和Freund于1991年提出的 Boosting算法几乎相同,但不需要任何关于弱学习器的先验知识,因而更容易应用到实际问题当中。

    Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。


    1995, Vapnik and Cortes, Support Vector Machines (SVM)

    640?wx_fmt=jpeg

    图十 支持向量机(图片来源:维基百科)

    支持向量机的出现是机器学习领域的另一大重要突破,该算法具有非常强大的理论地位和实证结果。那一段时间机器学习研究也分为NN和SVM两派。然而,在2000年左右提出了带核函数的支持向量机后。SVM在许多以前由NN占据的任务中获得了更好的效果。此外,SVM相对于NN还能利用所有关于凸优化、泛化边际理论和核函数的深厚知识。因此SVM可以从不同的学科中大力推动理论和实践的改进。

    而神经网络遭受到又一个质疑,通过Hochreiter等人1991年和Hochreiter等人在2001年的研究表明在应用BP算法学习时,NN神经元饱和后会出现梯度损失(gradient loss)的情况。简单地说,在一定数量的epochs训练后,NN会产生过拟合现象,因此这一时期NN与SVM相比处于劣势。


    2001, Breiman, Random Forests(RF)

    决策树模型由布雷曼博士在2001年提出,它是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想—集成思想的体现。

    其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

    1.5 爆发时期


    2006, Hinton, Deep Learning

    在机器学习发展分为两个部分,浅层学习(Shallow Learning)和深度学习(Deep Learning)。浅层学习起源上世纪20年代人工神经网络的反向传播算法的发明,使得基于统计的机器学习算法大行其道,虽然这时候的人工神经网络算法也被称为多层感知机,但由于多层网络训练困难,通常都是只有一层隐含层的浅层模型。

    神经网络研究领域领军者Hinton在2006年提出了神经网络Deep Learning算法,使神经网络的能力大大提高,向支持向量机发出挑战。 2006年,机器学习领域的泰斗Hinton和他的学生Salakhutdinov在顶尖学术刊物《Scince》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。

    这篇文章有两个主要的讯息:1)很多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻划,从而有利于可视化或分类;2)深度神经网络在训练上的难度,可以通过“逐层初始化”( layer-wise pre-training)来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。

    2015年,为纪念人工智能概念提出60周年,LeCun、Bengio和Hinton推出了深度学习的联合综述。

    深度学习可以让那些拥有多个处理层的计算模型来学习具有多层次抽象的数据的表示。这些方法在许多方面都带来了显著的改善,包括最先进的语音识别、视觉对象识别、对象检测和许多其它领域,例如药物发现和基因组学等。深度学习能够发现大数据中的复杂结构。它是利用BP算法来完成这个发现过程的。BP算法能够指导机器如何从前一层获取误差而改变本层的内部参数,这些内部参数可以用于计算表示。深度卷积网络在处理图像、视频、语音和音频方面带来了突破,而递归网络在处理序列数据,比如文本和语音方面表现出了闪亮的一面。

    当前统计学习领域最热门方法主要有deep learning和SVM(supportvector machine),它们是统计学习的代表方法。可以认为神经网络与支持向量机都源自于感知机。

    神经网络与支持向量机一直处于“竞争”关系。SVM应用核函数的展开定理,无需知道非线性映射的显式表达式;由于是在高维特征空间中建立线性学习机,所以与线性模型相比,不但几乎不增加计算的复杂性,而且在某种程度上避免了“维数灾难”。而早先的神经网络算法比较容易过训练,大量的经验参数需要设置;训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优。

    神经网络模型貌似能够实现更加艰难的任务,如目标识别、语音识别、自然语言处理等。但是,应该注意的是,这绝对不意味着其他机器学习方法的终结。尽管深度学习的成功案例迅速增长,但是对这些模型的训练成本是相当高的,调整外部参数也是很麻烦。同时,SVM的简单性促使其仍然最为广泛使用的机器学习方式。

    1.6 启示与未来的发展

    人工智能机器学习是诞生于20世纪中叶的一门年轻的学科,它对人类的生产、生活方式产生了重大的影响,也引发了激烈的哲学争论。但总的来说,机器学习的发展与其他一般事物的发展并无太大区别,同样可以用哲学的发展的眼光来看待。

    机器学习的发展并不是一帆风顺的,也经历了螺旋式上升的过程,成就与坎坷并存。其中大量的研究学者的成果才有了今天人工智能的空前繁荣,是量变到质变的过程,也是内因和外因的共同结果。

    机器学习的发展诠释了多学科交叉的重要性和必要性。然而这种交叉不是简单地彼此知道几个名词或概念就可以的,是需要真正的融会贯通:

    • 统计学家弗莱德曼早期从事物理学研究,他是优化算法大师,而且他的编程能力同样令人赞叹;

    • 乔丹教授既是一流的计算机学家,又是一流的统计学家,而他的博士专业为心理学,他能够承担起建立统计机器学习的重任;

    • 辛顿教授是世界最著名的认知心理学家和计算机科学家。虽然他很早就成就斐然,在学术界声名鹊起,但他依然始终活跃在一线,自己写代码。他提出的许多想法简单、可行又非常有效,被称为伟大的思想家。正是由于他的睿智和身体力行,深度学习技术迎来了革命性的突破。

    深度学习的成功不是源自脑科学或认知科学的进展,而是因为大数据的驱动和计算能力的极大提升。可以说机器学习是由学术界、工业界、创业界(或竞赛界)等合力造就的。学术界是引擎,工业界是驱动,创业界是活力和未来。学术界和工业界应该有各自的职责和分工。学术界的职责在于建立和发展机器学习学科,培养机器学习领域的专门人才;而大项目、大工程更应该由市场来驱动,由工业界来实施和完成。

    对于机器学习的发展前途,中科院数学与系统科学研究院陆汝铃老师在为南京大学周志华老师的《机器学习》一书作序时提出了六大问题,我觉得这些问题也许正是影响机器学习未来发展方向的基本问题,因此我摘录其中五个在此(有两个问题属于同一个主题,合并之):

    • 问题一:在人工智能发展早期,机器学习的技术内涵几乎全部是符号学习,可是从二十世纪九十年代开始,统计机器学习有一匹黑马横空出世,迅速压倒并取代了符号学习的地位。人们可能会问,符号学习是否被彻底忽略了?他还能成为机器学习的研究对象吗?它是否能继续在统计学习的阴影里苟延残喘?

    第一种观点:退出历史舞台——没有人抱有这种想法。

    第二种观点:统计学习和符号学习结合起来——王珏教授认为,现在机器学习已经到了一个转折点,统计学习要想进入一个更高级的形式,就应该和知识相结合,否则就会停留于现状而止步不前。

    第三种观点:符号学习还有翻身之日——Chandrasekaran教授认为机器学习并不会回到“河西”,而是随着技术的进步逐渐转向基本的认知科学。

    • 问题二:统计机器学习的算法都是基于样本数据独立同分布的假设,但自然界现象千变万化,哪里有那么多独立同分布?那么“独立同分布”条件对于机器学习来说是必需的吗?独立同分布的不存在一定是不可逾越的障碍吗?

    迁移学习也许会给问题的解决带来一丝曙光?

    • 问题三:近年来出现了一些新的动向,比如深度学习。但他们真的代表机器学习新的方向吗?

    包括周志华老师在内的一些学者认为深度学习掀起的热潮大过它本身的贡献,在理论和技术上并没有太多的创新,只不过硬件技术的革命使得人们能采用原来复杂度很高的算法,从而得到更精细的结果。

    • 问题四:机器学习研究出现以来,我们看到的主要是从符号方法到统计方法的演变,用到的数学主要是概率统计。但是今天数学之大,就像大海,难道只有统计方法适合于在机器学习方面的应用?

    目前流行学习已经“有点意思了”,但数学理论的介入程度远远不够,有待更多数学家参与,开辟新的模式、理论和方法。

    • 问题五:大数据时代的出现,有没有给机器学习带来本质性的影响?

    大数据时代给机器学习带来了前所未有的机遇,但是同样的统计、采样方法相较以前有什么本质不同吗?又从量变过渡到质变吗?数理统计方法有没有发生质的变化?大数据时代正在呼吁什么样的机器学习方法?哪些方法又是大数据研究的驱动而产生的呢?

    2、机器学习基本概念

    权威定义:

    Arthur samuel: 在不直接针对问题进行编程的情况下,赋予计算机学习能力的一个研究领域。

    Tom Mitchell: 对于某类任务T和性能度量P,如果计算机程序在T上以P衡量的性能随着经验E而自我完善,那么就称这个计算机程序从经验E学习。

    其实随着学习的深入,慢慢会发现机器学习越来越难定义,因为涉及到的领域很广,应用也很广,现在基本成为计算机相关专业的标配,但是在实际的操作过程中,又慢慢会发现其实机器学习也是很简单的一件事,我们最的大部分事情其实就是两件事情,一个是分类,一个是回归。比如房价的预测、股价的预测等是回归问题,情感判别、信用卡是否发放等则是属于分类。现实的情况 一般是给我们一堆数据,我们根据专业知识和一些经验提取最能表达数据的特征,然后我们再用算法去建模,等有未知数据过来的时候我们就能够预测到这个是属于哪个类别或者说预测到是一个什么值以便作出下一步的决策。比如说人脸识别系统,目的是作为一个验证系统,可能是一个权限管理,如果是系统中的人则有权限否则没有权限,首先给到我们的数据是一堆人脸的照片,第一步要做的事情是对数据进行预处理,然后是提取人脸特征,最后选择算法比如说SVM或者RF等等,算法的最终选择设计到评价标准,这个后面具体讲,这样我们就建立了一个人脸识别的模型,当系统输入一张人脸,我们就能够知道他是不是在系统之中。机器学习的整个流程不过就这几步,最后不过就是参数寻优,包括现在如火如荼的机器学习。

    当我们判断是否要使机器学习时,可以看看是不是以下的场景

    1. 人类不能手动编程;

    2. 人类不能很好的定义这个问题的解决方案是什么;

    3. 人类不能做i到的需要极度快速决策的系统;

    4. 大规模个性化服务系统;

    640?wx_fmt=jpeg

    3、机器学习分类

    3.1、监督式学习 Supervised Learning

    在监督式学习下,每组训练数据都有一个标识值或结果值,如客户流失对应1,不流失对应0。在建立预测模型的时候,监督式学习建立一个学习过程,将预测的结果与训练数据的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。

    640?wx_fmt=jpeg

    分类 Classification

    1. K最近邻 K-Nearest Neighbor (KNN)

    2. 朴素贝叶斯 Naive Bayes

    3. 决策树 Decision Tree:C4.5、分类回归树 Classification And Regression Tree (CART)

    4. 支持向量机器 Support Vector Machine (SVM)

    回归 Regression

    1. 线性回归 linear regression

    2. 局部加权回归 Locally weighted regression

    3. 逻辑回归 logistic Regression

    4. 逐步回归 stepwise regression

    5. 多元自适应回归样条法 multivariate adaptive regression splines

    6. 局部散点平滑估计 Locally estimated scatter plot smoothing ( LOESS )

    7. 岭回归 Ridge Regression

    8. Least Absolute Shrinkage and Selection Operator ( LASSO )

    9. 弹性网络 Elastic Net

    10. 多项式回归 Polynomial Regression

    排序 Rank

    1. 单文档分类 Pointwise:McRank

    2. 文档对方法(Pairwise):Ranking SVM、RankNet、Frank、RankBoost

    3. 文档列表方法(Listwise):AdaRank、SoftRank、LambdaMART

    匹配学习

    1. 人工神经网络:感知神经网络 Perception Neural Network、反向传递 Back Propagation、Hopfield网络、自组织映射 Self-Organizing Map ( SOM )、学习矢量量化 Learning Vector Quantization ( LVQ )

    3.2 半监督学习

    在半监督学习方式下,训练数据有部分被标识,部分没有被标识,这种模型首先需要学习数据的内在结构,以便合理的组织数据来进行预测。算法上,包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如深度学习:

    深度学习 Deep Learning

    深度学习是 监督学习的匹配学习中人工神经网络延伸出来发展出来的。

    1. 受限波尔兹曼机 Restricted Boltzmann Machine ( RBM )

    2. 深度信念网络 Deep Belief Networks ( DBN )

    3. 卷积网络 Convolutional Network

    4. 栈式自编码 Stacked Auto-encoders

    3.3 无监督学习 Unsupervised Learning

    在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。

    聚类 Cluster

    1. K均值 k-means

    2. 最大期望算法 Expectation Maximization ( EM )

    3. 降维方法 Dimensionality Reduction:主成分分析Principal Component Analysis ( PCA )、偏最小二乘回归 Partial Least Squares Regression ( PLS )、Sammon映射 Sammon Mapping、多维尺度分析 Multidimensional Scaling ( MDS )、投影寻踪 Projection Pursuit、RD

    关联规则 Association Rule

    1. Apriori

    2. Eclat

    3.4 增强学习 Reinforcement Learning

    在之前的讨论中,我们总是给定一个样本x,然后给或者不给标识值或结果值(给了就是监督式学习,不给就是无监督式学习)。之后对样本进行拟合、分类、聚类或者降维等操作。然而对于很多序列决策或者控制问题,很难有这么规则的样本。比如,四足机器人的控制问题,刚开始都不知道应该让其动那条腿,在移动过程中,也不知道怎么让机器人自动找到合适的前进方向。

    增强学习要解决的是这样的问题:一个能感知环境的自治agent,怎样通过学习选择能达到其目标的最优动作。这个很具有普遍性的问题应用于学习控制移动机器人,在工厂中学习最优操作工序以及学习棋类对弈等。当agent在其环境中做出每个动作时,施教者会提供奖励或惩罚信息,以表示结果状态的正确与否。例如,在训练agent进行棋类对弈时,施教者可在游戏胜利时给出正回报,而在游戏失败时给出负回报,其他时候为零回报。agent的任务就是从这个非直接的,有延迟的回报中学习,以便后续的动作产生最大的累积效应。

    1. Q-Learning

    2. 时间差学习 Temporal difference learning

    3.5 其他

    集成算法

    集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。

    1. Boosting

    2. Bootstrapped Aggregation ( Bagging )

    3. AdaBoost

    4. 堆叠泛化 Stacked Generalization

    5. 梯度推进机 Gradient Boosting Machine ( GBM )

    6. 随机森林 Random Forest

    参考:

    ttp://www.studyai.com/article/ad75a319

    http://www.ppvke.com/Blog/archives/22887

    http://blog.csdn.net/andrewseu/article/details/53488664


    来源:大数据与生活

    文章版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


    640?wx_fmt=png

    展开全文
  • 什么是NFV?它与SDN有什么关系?

    万次阅读 多人点赞 2018-09-09 21:27:31
    这两者关系密不可分,但两者关系严重缺乏对称性,网络一直拖累着计算。 4G网络RAN将会不断进化,据说,未来的4G网络空口速率将是现在的10倍。随着智能硬件的爆发,大量的应用接入4G网络,人们的流量需...

    NFV负责各种网元的虚拟化,而SDN负责网络本身的虚拟化(比如,网络节点和节点之间的相互连接

     

    什么叫网络虚拟化?先上两张简单粗暴的图。

    什么是NFV?它与SDN有什么关系?图1

    什么是NFV?它与SDN有什么关系?图2

    所有的通信应用无非就是两部分组成:计算和网络。这两者关系密不可分,但两者关系严重缺乏对称性,网络一直拖累着计算。

    4G网络RAN将会不断进化,据说,未来的4G网络空口速率将是现在的10倍。随着智能硬件的爆发,大量的应用接入4G网络,人们的流量需求如同海啸般汹涌而至,我们似乎赶上了好时代。不过,传统的通信网络里,每一类服务对应基于专用集成电路的带有专用处理器的专用服务器。网络里的设备很多,但是,这些家伙就像霸道总裁的办公室,仅供总裁专用,不管他在与不在,位置都占在那里,谁也不敢冒然挪用。

    这样下去,网络会严重拖计算的后腿。于是,有人想到了虚拟化。

    或者,可以这么理解,服务器觉得老这样拖着网络跑不是办法,迟早会被累死,就开始向网络扔砖头了!

    什么是NFV?它与SDN有什么关系?图3

    专用的硬件对应专用的服务,这样的花费是昂贵的,为了节省成本,我们得想想物尽其用。

    想想你有一栋超级大的空置的公寓,你想出租,但是每一位租客的需求是不一样的。这个时候,你想到了“虚拟化”。根据租客的需求,把这栋公寓虚拟化成不同的建筑风格。于是,你对租客1说,“我有两栋公寓要出租,你喜欢红色那一栋还是蓝色那一栋?”。然后你对租客2说,“我有三栋公寓要出租,大、中、小,你喜欢哪一栋?”。接着租客3。。。 继续忽悠。。。 然后,所有的租客都住进了你的虚拟公寓,你按住宿时间和使用空间来收租金。

    什么是NFV?它与SDN有什么关系?图4

    2012年10月,13家运营商发起在ETSI组织下正式成立网络功能虚拟化工作组,即ETSI ISG NFV,致力于实现网络虚拟化的需求定义和系统架构制定。

    谈到虚拟化,首先得了解什么是虚拟化技术?最常用的虚拟化技术有操作系统中内存的虚拟化,实际运行时用户需要的内存空间可能远远大于物理机器的内存大小,利用内存的虚拟化技术,用户可以将一部分硬盘虚拟化为内存,而这对用户是透明的。又如,可以利用虚拟专用网技术(VPN)在公共网络中虚拟化一条安全,稳定的“隧道”,用户感觉像是使用私有网络一样。

    NFV就是基于大型共享的OTS(Off-The-Shelf,成品)服务器,通过软件定义的方式,探索网络实体的虚拟化使用。在NFV中使用的虚拟机(Virtual Machines,VMs)技术是虚拟化技术的一种。

    基于软件定义的虚拟机部署成本低,而且可以快速适应网络需求变化。虚拟机就像是将所有能想到的东西都放在一台物理服务器(physical server)上,有了云计算和虚拟化,那些冗余的服务器都可以部署在独立的物理服务器上,不但可以并行处理,满足网络峰值需求,还可以根据网络需求随时释放资源,方便部署,利于故障管理,快速升级,快速满足市场需求。

    NFV技术颠覆了传统电信封闭专用平台的思想,同时引入灵活的弹性资源管理理念,因此,ETSI NFV提出了突破传统网元功能限制、全新通用的NFV架构下图所示。

    什么是NFV?它与SDN有什么关系?图5

    NFV技术主要由3个部分构成:VNF(虚拟网络层,Virtualized Network Function)、NFVI(网络功能虚拟化基础设施NFVI,NFV Infrastructure)和MANO(NFV管理与编排,Management and Orchestration)。

    (1)虚拟网络层是共享同一物理OTS服务器的VNF集。对应的就是各个网元功能的软件实现,比如EPC网元、IMS网元等的逻辑实现。

    (2)NFVI,你可以将它理解为基础设施层,从云计算的角度看,就是一个资源池。NFVI需要将物理计算/存储/交换资源通过虚拟化转换为虚拟的计算/存储/交换资源池。NFVI映射到物理基础设施就是多个地理上分散的数据中心,通过高速通信网连接起来。

    (3)NFVMANO。基于不同的服务等级协议(Service Level Agreements ,SLAs),NFVMANO运营支撑层负责“公平”的分配物理资源,同时还负责冗余管理、错误管理和弹性调整等,相当于目前目前的OSS/BSS系统。

    这样一来,现在的移动通信网络结构就变成了这样:

    什么是NFV?它与SDN有什么关系?图6

    上图顶部的VNF对应了网元功能的逻辑实现,比如,由多个VNF组成的VNF-FG(VNF Forwarding Graph)定义了LTE网络服务。

    那么软件定义网络(SDN)和NFV又有什么关系呢?

    NFV负责各种网元的虚拟化,而SDN负责网络本身的虚拟化(比如,网络节点和节点之间的相互连接)。我们先来看看一个典型的网络结构图。

    什么是NFV?它与SDN有什么关系?图7

    如上图,一个网络由网络节点和节点间的链路组成。每一个节点都有一个控制面和与其它节点交换的网络信息。在上图中,右边的H节点获知一个新的网络(10.2.3.x/24)存在,现在它需要将这一信息告诉给网络中的其它节点。然而,节点H只和节点F和G直接相连,节点H通过链路状态通告(Link State Advertisements ,LSAs)通知节点F和G,F和G再将信息传递给它们的邻近节点,最终该消息传达到整个网络。这样,网络内每个节点都会更新自己的路由表,以确保数据可以传送到网络10.2.3.x/24。

    如果节点C和E之间的链路中断,尽管C和E知道C-E链路中断,但节点A并不知道,节点A会继续通过C-E链路向网络10.2.3.x/24传送数据包。由于节点的“近视”,导致数据堆积在该节点,这需要花一些时间来向整个网络传送网络状态更新信息和完成纠错。网络越大,这种情况就越容易发生。

    我们再来看看节点G,它由控制面(control plane)和数据面(data plane)组成。为了适应快速更新,控制面基本上是基于软件的,这实际上意味着控制消息的处理时长比基于硬件的逻辑单元(比如,数据面)要慢5到10倍。一直以来,我们仅要求控制面能够灵活更新,但对时延要求并不是太高。相对于数据面来讲,时延要求较高,我们希望数据包能够传送得越快越好,所以它必须是基于硬件来实现的。尽管基于软件实现的控制面能满足目前的要求,但随着设备的大量接入,特别是物联网的应用,控制面的时延也需要进一步提升。

    软件定义网络(SDN)负责分离控制面和数据面,将网络控制面整合于一体。这样,网络控制面对网络数据面就有一个宏观的全面的视野。路由协议交换、路由表生成等路由功能均在统一的控制面完成。实现控制平面与数据平面分离的协议叫OpenFlow,OpenFlow是SDN一个网络协议。如下图所示:

    什么是NFV?它与SDN有什么关系?图8

    从上图中,我们可以看到,首先需要通过OpenFlow将网络拓扑镜像到控制面,控制面初始化网络拓扑,初始化完成后,控制面会实时更新网络拓扑。

    控制面完成初始化后,会向每个转发节点发送转发表,根据转发表用户数据在网络内传送。假设现在节点H获知新的网络 (10.2.3.x/24)。节点H将通过OpenFlow告知控制面,因为控制面统领全局,它可以快速的为每一个转发节点创建新的路由表,这样用户数据就可以传送到这个新网络。
     
    转载自:网优雇佣军微信公众号

    展开全文
  • 关系数据库模型设计

    千次阅读 2020-05-19 17:13:17
    本文从现实世界-概念世界(信息世界)-机器世界(数据世界)逐级抽象,旨在以浅显易懂的语言描述关系数据库应该如何建模,最后用简单名了的描述给出关系模型的设计范式的含义。

    目录

     

    三个世界的划分

    1.现实世界

    2.概念世界(信息世界)

    3.机器世界(数据世界)

    模型

    一、概念模型(信息世界)

    (一)E-R图的三要素

    (二)E-R图的设计方法

    (三)E-R模型到关系模型的转换

    (四)小结

    二、数据模型(数据世界)

    (一)层次模型

    (二)网状模型

    (三)关系模型


    三个世界的划分

    人们把客观存在的事物以数据的形式存储到计算机中,经历了对现实生活中事物特性的认识、概念化到计算机数据库里的具体表示的逐级抽象过程,即现实世界-概念世界-机器世界三个领域。有时也将概念世界称为信息世界;将机器世界称为存储或数据世界。

     

    1.现实世界

    人们管理的对象存于现实世界中。现实世界的事物及事物之间存在着联系,这种联系是客观存在的,是由事物本身的性质决定的。例如学校的教学系统中有教师、学生、课程,教师为学生授课,学生选修课程并取得成绩。

     

    2.概念世界(信息世界)

    概念世界是现实世界在人们头脑中的反映,是对客观事物及其联系的一种抽象描述,从而产生概念模型。概念模型是现实世界到机器世界必然经过的中间层次。涉及到下面几个术语:
    实体:我们把客观存在并且可以相互区别的事物称为实体。实体可以是实际事物,也可以是抽象事件。如一个职工、一场比赛等。
    实体集:同一类实体的集合称为实体集。如全体职工。注意区分"型"与"值"的概念。如每个职工是职工实体"型"的一个具体"值。
    属性:描述实体的特性称为属性。如职工的职工号,姓名,性别,出生日期,职称等。
    联系:实体集之间的对应关系称为联系,它反映现实世界事物之间的相互关联。联系分为两种,一种是实体内部各属性之间的联系。另一种是实体之间的联系。

     

    3.机器世界(数据世界)

    存入计算机系统里的数据是将概念世界中的事物数据化的结果。为了准确地反映事物本身及事物之间的各种联系,数据库中的数据必须有一定的结构,这种结构用数据模型来表示。数据模型将概念世界中的实体,及实体间的联系进一步抽象成便于计算机处理的方式。三个世界中的术语对照关系如下:

     

    模型

    模型就是对不能直接观察的事物进行形象的描述和模拟。即模型是对现实世界中复杂事物的抽象描述。

    模型分为信息世界的概念模型和数据世界的数据模型:

    概念模型:把现实世界转换为信息世界的模型,例如E-R模型。

    数据模型:把信息世界转化为数据世界的模型,例如关系模型。

     

    一、概念模型(信息世界)

    实体联系模型,亦称实体关系模型,它是由美籍华裔计算机科学家陈品山(Peter Chen)发明,该模型直接从现实世界中抽象出实体类型和实体间联系,然后用实体联系图(E-R图)表示数据模型,是描述概念世界,建立概念模型的实用工具。所以,在信息世界中使用E-R图建立的数据模型称为E-R模型。

    实体关系模型是现实世界到概念世界的第一层抽象,是数据库设计人员进行数据库设计的有利的数据建模工具,也是数据库设计人员和用户之间进行交流的语言。

     

    (一)E-R图的三要素

    实体(Entity):在E-R图中用矩形表示,矩形框内标注实体名称。实体表示一个离散对象。实体可以被(粗略地)认为是名词,如计算机、雇员、歌曲、数学定理等。


    属性(Attribute):在E-R图中用椭圆形表示,并用无向连线将其与相应的实体连接起来,同时在无向连线旁标上联系的类型(1 : 1,1 : n或m : n)。属性描述实体的特性(特征性质),例如学生的姓名、学号、性别、都是属性。

     

    联系(Relationship):在E-R图中用菱形框表示,框内标注联系名称,并用连线将菱形框分别与有关实体相连,并在连线上注明联系类型。联系可以被(粗略地)认为是动词,如:在公司和计算机之间的拥有关联,在雇员和部门之间的管理关联,在演员和歌曲之间的表演关联,在数学家和定理之间的证明关联等等。联系有三种类型:


    ① 一对一联系(1:1)
    设A、B为两个实体集。若A中的每个实体至多和B中的一个实体有联系,反过来,B中的每个实体至多和A中的一个实体有联系,称A对B或B对A是1:1联系。注意,1:1联系不一定都是一一对应的关系。可能存在着无对应。例如,一个部门有一个经理,而每个经理只在一个部门任职,则部门与经理的联系是一对一的,但经理也可能暂缺。


    ② 一对多联系(1:n)
    如果A实体集中的每个实体可以和B中的几个实体有联系,而B中的每个实体至少和A中的一个实体有联系,那么A对B属于1:n联系。例如,一个部门有多名职工,而一名职工只在一个部门就职,则部门与职工的联系是一对多的。


    ③ 多对多联系(m:n)
    若实体集A中的每个实体可与和B中的多个实体有联系,反过来,B中的每个实体也可以与A中的多个实体有联系,称A对B或B对A是m:n联系。例如,一个学生可以选修多门课程,一门课程由多个学生选修,学生和课程间的联系是多对多的。
     

    (二)E-R图的设计方法

    E-R图通常都应经过以下两个阶段:

    (1)针对每一用户画出该用户信息的局部E-R图,确定该用户视图的实体、属性和联系。需注意的是:能作为属性的就不要作为实体,这有利于E-R图的简化。

     

    (2)综合局部E-R图,生成总体E-R图。在综合过程中,同名实体只能出现一次,还要去掉不必要的联系,以便消除冗余。一般来说,从总体E-R图必须能导出原来的所有局部视图,包括实体、属性和联系。

     

    案例:工厂(包括厂名和厂长名)需要建立一个数据库系统,有以下情况:

     

    1、该工厂生产若干产品,每种产品由不同的零件组成

    2、有的零件可以用在不同的产品,这些零件由不同的原材料组成,不同的零件所用的原材料可以相同。

    3、零件按照所属的不同产品分别放在仓库中,原材料按照类别分别放在若干仓库中。

     

    相关性质如下:

    工厂:长号,长名,长址,厂长名

    车间:车间号,车间名,电话

    产品:产品名,品种号,性能

    零件:零件号,零件名,生产日期

    原材料:材料号,产地,等级

    仓库:库号,电话

     

    (三)E-R模型到关系模型的转换

    把E-R图转换为关系模型可遵循如下原则:

    (1)对于E—R图中每个实体集,都应转换为一个关系,该关系应包括对应实体的全部属性,并应根据关系所表达的语义确定哪个属性或哪几个属性组作为“主关键字”,主关键字用来标识实体。

     

    (2)对于E—R图中的联系,情况比较复杂,要根据实体联系方式的不同,采取不同的手段加以实现。下面着重讨论联系的转换方法。

    A、两实体集间1:n联系

    两实体集间1:n联系,可将“一方”实体的主关键字纳入“n方”实体集对应的关系中作为“外部关键字”,同时把联系的属性也一并纳入“n方”对应的关系中。

     

    B、两实体集间m:n联系

    对于两实体集间m:n联系,必须对“联系”单独建立一个关系,用来联系双方实体集。该关系的属性中至少要包括被它所联系的双方实体集的“主关键字”,并且如果联系有属性,也要归入这个关系中。

     

    C、两实体集间的1:1的联系

    假设A实体集与B实体集是1:1的联系,联系的转换有三种方法:

    ①把A实体集的主关键字加入到B实体集对应的关系中,如果联系有属性也一并加入;

    ②把B实体集的主关键字加入到A实体集对应的关系中,如果联系有属性也一并加入;

    ③建立第三个关系,关系中包含两个实体集的主关键字,如果联系有属性也一并加入。

     

    (四)小结

    (1)把现实世界转换成为计算机能够处理的数据世界,需经过两个阶段:

             第一个阶段需使用概念模型把现实世界抽象成信息世界,最常用的概念模型是E-R模型,E-R模型的三个基本要素是实体、

             属性和联系。

             第二阶段是使用数据模型把信息世界转换为数据世界,最常用的数据模型是关系模型。

     

    (2)设计E-R图一般经过两个步骤,

            第一步是抽象出各相关对象的局部E-R图,

            第二步是把局部E-R图组合成全局E-R图。E-R图只是信息的一种抽象表示,还需把它转化成相应的实施数据模型才能转化为

            数据库中的数据。把E-R图转化为关系模型,不但要把实体转化成关系,而且在关系中还应反映出E-R图中各实体集之间的

            联系。

     

    3E-R数据模型作为语义数据模型,是软件工程和数据库设计的有力工具,综合E-R数据模型的特点如下:
          (1) 有丰富的语义表达能力,能充分反映现实世界,包括实体和实体间的联系,能满足用户对数据对象的处理要求。
          (2) 易于交流和理解,因为它不依赖于计算机系统和具体的DBMS,所以,它是DBA、系统开发人员和用户之间的桥梁。
          (3) 易于修改和扩充。
          (4) 易于向其他各种数据模型(层次,网状,关系模型)转换。
          (5) 实体、属性和联系这三个概念是有明确区分的,但对于某个具体的数据对象,究竟是作为实体,还是作为属性或联系,

                  则是相对的。这取决于应用背景和用户的观点。

     

    二、数据模型(数据世界)

    在用计算机处理信息世界的信息时,必须抽取局部范围的主要特征,模拟和抽象出一个能反映信息世界中实体和实体之间联系的模型,即数据模型。也就是说,数据模型是抽象描述信息世界的一种工具和方法,是概念模型在数据世界中的表示形式。

    数据模型的三要素:模型结构、数据操作、完整性规则。

    数据模型模型结构分为:层次模型、网状模型、关系模型、面向对象模型。

     

    (一)层次模型

    在现实世界中,许多实体集之间的联系就是一个自然的层次关系。例如,行政机构、家族关系等都是层次关系。下图就是学校中系的层次模型。

    层次模型是最早用于商品数据库管理系统的数据模型。其典型代表是于1969问世、由IBM公司开发的数据库管理系统

    IMS(Information Management System)。

    (1) 层次模型的定义:用树形结构表示实体之间联系的模型叫层次模型。

    (2)层次模型的表示方法:树的结点表示记录(实体),每个记录可包含若干个字段(实体的属性),结点之间的连线表示相连两记录(实体)之间的关系,这种关系只能是“1-M”的。通常把表示1的实体集放在上方,称为父结点,表示M的实体集放在下方,称为子结点。

    (3)层次模型的特点:①有且仅有一个根结点。②根结点以外的其它结点有且仅有一个父结点。

    在层次模型中,记录的组织不再是一张杂乱无章的图,而是一棵树。例如,系记录型有:计算机系、电信系等记录值。而计算机系的下层记录值有软件、结构、应用等研究室和数据结构、操作系统、数据库等课程,软件研究室下层又有员工和项目记录值,如下图所示:

    根据层次模型的特点可知,层次模型只能表示“1-M”关系,而不能直接表示“M-M”关系。因此对于层次模型中实体集之间多对多的联系的处理,解决的方法是引入冗余结点。例如,学生和课程之间的多对多的联系,引入学生和课程的冗余结点,即转换为两棵树:一棵树的根是学生,子结点是课程,它表现了一个学生可以选多门课程;一棵树的根是课程,子结点是学生,它反映了一门课程可以被多个学生选。至于冗余结点可以用虚拟结点实现:在冗余结点处仅存放一个指针,指向实际结点。

     

    (4)层次模型的优点

    ① 层次数据库模型比较简单。

    ② 层次模型对具有一对多的层次关系(例如部门和职员的关系)的描述非常自然、直观,容易理解。

    ③ 层次数据库模型提供了良好的完整性支持。

     

    (5)层次模型的缺点

    ① 在现实世界中有很多的非层次性的联系,如多对多的联系,一个结点具有多个父结点等,层次模型表示这类联系的方法

    很笨拙。

    ② 难以实现系统扩充,对于插入和删除操作时,限制比较多,涉及到大量链接指针的调整。

    ③ 查询子结点必须经过父结点。

    ④ 由于结构严密,层次命令趋于程序化。

     

    (二)网状模型

    在现实世界中,事物之间的联系更多的是非层次关系的,用层次模型表示非树型结构是很不直接的,网状模型则可以克服这一弊病。层次模型中的记录只能组织成树的集合而不能是任意图的集合,而网状模型则可以。

    (1) 网状模型的定义:用网状结构表示实体之间联系的模型叫网状模型。

    (2) 网状模型的表示方法:网的结点表示记录(实体),每个记录可包含若干个字段(实体的属性),结点之间的连线表示相连两记录(实体)之间的关系,这种关系可以是“1-M”的,也可以是“M-M”的。

    (3) 网状模型的特点:①允许一个以上的结点无父亲结点。②一个结点可以有多于一个的父亲结点。

    网状模型是一种比层次模型更具普遍性的结构,它去掉了层次模型的两个限制,允许多个结点没有父亲结点,允许结点有多个父亲结点,此外它还允许两个结点之间有多种联系。因此网状模型可以更直接地去描述现实世界,而层次模型实际上是网状模型的一个特例。网状模型示例如下:

     

    (4) 网状数据模型的优点

    ①能够更为直接地描述现实世界,如一个结点可以有多个父亲节点。

    ②具有良好的性能,存取效率较高。

     

    (5) 网状数据模型的缺点

    ①结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握。

    ②难以实现系统扩充,对于插入和删除操作时,限制比较多,涉及到大量链接指针的调整。

    ③其DDL,DML语言复杂,用户不容易使用。由于记录之间联系是通过存取路径实现的,应用程序在访问数据时必须选择

    适当的存取路径,因此,用户必须了解系统结构的细节,加重了编写应用程序的负担。

     

    (三)关系模型

     

    (1) 关系模型的定义:用二维表格数据来表示实体及实体之间联系的模型叫关系模型。

    (2) 关系模型的特点:

    ① 每个表有多个列,每一列中的字段(属性)唯一且是类型相同的数据;

    ② 列的顺序可以是任意的;

    ③ 行的顺序可以是任意的;

    ④ 表中的字段(属性)是不可再分割的最小数据项,即表中不允许有子表;

    ⑤ 表中的任意两行不能完全相同。

    在关系模型中,无论是从客观事物中抽象出的实体,还是实体之间的联系,都用单一的结构类型—关系(表)来表示。在对关系进行各种处理之后,得到的还是关系—一张新的二维表。如图所示:

    关系数据库采用关系模型作为数据的组织方式。关系数据库因其严格的数学理论、使用简单灵活、数据独立性强等特点,而被公认为最有前途的一种数据库管理系统。它的发展十分迅速,目前已成为占据主导地位的数据库管理系统。自20世纪80

    年代以来,作为商品推出的数据库管理系统几乎都是关系型的,例如,Oracle,Sybase,Informix,Visual FoxPro,Mysql,Sqlserver等。

     

    (3) 关系模型的设计范式

    只有满足一定条件的关系模式,才能避免操作(例如插入、删除、修改)异常和数据异常(例如数据冗余),关系模式要满足的条件称为规范化形式,简称范式。 

     

    ① 第一范式(1NF)

    第一范式是对表属性的原子性约束,要求属性具有原子性,不可再分解成其它属性;其目的是消除重复字段(列)。

     

    ②  第二范式(2NF)

    第二范式是对表记录的惟一性约束,要求记录有惟一标识,能唯一地区分其它记录;其目的是消除重复记录(行)。

     

    ③ 第三范式(3NF)

    第三范式是对表字段冗余性的约束,要求字段没有冗余,任何字段都不能由其他字段派生出来;其目的是消除字段冗余。

     

    ④  第四范式(4NF)

    第四范式是对表记录冗余性的约束,要求记录没有冗余,同一表不存在一对多或多对多关系;其目的是消除记录冗余。

     

    ⑤  第五范式(5NF)

    第五范式是将表分割成尽可能小的块,目的是消除表中所有的冗余。

     

    在设计关系数据库表的时候,你应该总是要遵循这五大范式。

     

     

    展开全文
  • 我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoSQL有了非常深入的研究,但是在最近准备YunTable的Chart的时候,发现NoSQL不仅非常博大精深,而且我个人对NoSQL的理解也只是皮毛而已,但我还算是一个“知耻...

    云计算背后的秘密:NoSQL诞生的原因和优缺点

    我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoSQL有了非常深入的研究,但是在最近准备YunTable的Chart的时候,发现NoSQL不仅非常博大精深,而且我个人对NoSQL的理解也只是皮毛而已,但我还算是一个“知耻而后勇”的人,所以经过一段时间的学习之后,从本系列第六篇开始,就将和大家聊聊NoSQL,而本篇将主要给大家做一下NoSQL数据库的综述。 
    首先将和大家聊聊为什么NoSQL会在关系型数据库已经非常普及的情况下异军突起?

    诞生的原因

    随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 
    1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度; 
    2. 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量; 
    3. 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理;

    1. 庞大运营成本的考量:IT经理们希望在硬件成本、软件成本和人力成本能够有大幅度地降低;

    目前世界上主流的存储系统大部分还是采用了关系型数据库,其主要有一下优点:

    1.事务处理—保持数据的一致性;

    2.由于以标准化为前提,数据更新的开销很小(相同的字段基本上只有一处);

    3.可以进行Join等复杂查询。

    虽然关系型数据库已经在业界的数据存储方面占据不可动摇的地位,但是由于其天生的几个限制,使其很难满足上面这几个需求: 
    1. 扩展困难:由于存在类似Join这样多表查询机制,使得数据库在扩展方面很艰难; 
    2. 读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重; 
    3. 成本高:企业级数据库的License价格很惊人,并且随着系统的规模,而不断上升; 
    4. 有限的支撑容量:现有关系型解决方案还无法支撑Google这样海量的数据存储; 
    业界为了解决上面提到的几个需求,推出了多款新类型的数据库,并且由于它们在设计上和传统的NoSQL数据库相比有很大的不同,所以被统称为“NoSQL”系列数据库。总的来说,在设计上,它们非常关注对数据高并发地读写和对海量数据的存储等,与关系型数据库相比,它们在架构和数据模型方量面做了“减法”,而在扩展和并发等方面做了“加法”。现在主流的NoSQL数据库有BigTable、HBase、Cassandra、SimpleDB、CouchDB、MongoDB和Redis等。接下来,将关注NoSQL数据库到底存在哪些优缺点。

    优缺点

    在优势方面,主要体现在下面这三点: 
    1. 简单的扩展:典型例子是Cassandra,由于其架构是类似于经典的P2P,所以能通过轻松地添加新的节点来扩展这个集群; 
    2. 快速的读写:主要例子有Redis,由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作; 
    3. 低廉的成本:这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本; 
    4. 
    但瑕不掩瑜,NoSQL数据库还存在着很多的不足,常见主要有下面这几个: 
    1. 不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移成本; 
    2. 支持的特性不够丰富:现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不像MS SQL Server和Oracle那样能提供各种附加功能,比如BI和报表等; 
    3. 现有产品的不够成熟:大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语; 
    上面NoSQL产品的优缺点都是些比较共通的,在实际情况下,每个产品都会根据自己所遵从的数据模型和CAP理念而有所不同,接下来,将给大家介绍NoSQL两个最重要的概念:数据模型和CAP理念,并在本文最后,对主流的NoSQL数据库进行分类。

    Naresh Kumar是位软件工程师与热情的博主,对于编程与新事物拥有极大的兴趣,非常乐于与其他开发者和程序员分享技术上的研究成果。近日,Naresh撰文比较了NoSQL与RDBMS,并详细介绍了他们各自的特点与适用的场景。

    NoSQL并不是关系型数据库管理系统,本文将会介绍NoSQL数据库与关系型数据库之间的差别,同时还会讨论在何种场景下应该使用NoSQL,何种场景下不应该使用。由于NoSQL还是个相对较新的技术,因此它还面临着很多挑战。

    时至今日,互联网上有数以亿计的用户。大数据与云计算已经成为很多主要的互联网应用都在使用或是准备使用的技术,这是因为互联网用户每天都在不断增长,数据也变得越来越复杂,而且有很多非结构化的数据存在,这是很难通过传统的关系型数据库管理系统来处理的。NoSQL技术则能比较好地解决这个问题,它主要用于非结构化的大数据与云计算上。从这个角度来看,NoSQL是一种全新的数据库思维方式。

    为何要使用NoSQL数据库?

    1.NoSQL具有灵活的数据模型,可以处理非结构化/半结构化的大数据

    现在,我们可以通过Facebook、D&B等第三方轻松获得与访问数据,如个人用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据以及传感器生成的数据等。对这些数据的使用正在快速改变着通信、购物、广告、娱乐以及关系管理的特质。没有使用这些数据的应用很快就会被用户所遗忘。开发者希望使用非常灵活的数据库,能够轻松容纳新的数据类型,并且不会被第三方数据提供商内容结构的变化所累。很多新数据都是非结构化或是半结构化的,因此开发者还需要能够高效存储这种数据的数据库。但遗憾的是,关系型数据库所使用的定义严格、基于模式的方式是无法快速容纳新的数据类型的,对于非结构化或是半结构化的数据更是无能为力。NoSQL提供的数据模型则能很好地满足这种需求。很多应用都会从这种非结构化数据模型中获益,比如说CRM、ERP、BPM等等,他们可以通过这种灵活性存储数据而无需修改表或是创建更多的列。这些数据库也非常适合于创建原型或是快速应用,因为这种灵活性使得新特性的开发变得非常容易。

    2.NoSQL很容易实现可伸缩性(向上扩展与水平扩展)

    如果有很多用户在频繁且并发地使用你的应用,那么你就需要考虑可伸缩的数据库技术而非传统的RDBMS了。对于关系型技术来说,很多应用开发者会发现动态的可伸缩性是难以实现的,这时就应该考虑切换到NoSQL数据库上。对于云应用来说,关系型数据库一开始是普遍的选择。然而,在使用过程中却遇到了越来越多的问题,原因就在于他们是中心化的,向上扩展而非水平扩展的。这使得他们不适合于那些需要简单且动态可伸缩性的应用。NoSQL数据库从一开始就是分布式、水平扩展的,因此非常适合于互联网应用分布式的特性。

    在三层互联网架构的Web/应用层上,多年来向上扩展已经成为默认的扩展方式了。随着应用使用人数的激增,我们需要添加更多的服务器,性能则是通过负载均衡来实现的,这时的代价与用户数量成线性比例关系。在NoSQL数据库之前,数据库层的默认扩展方式就是向上扩展。为了支持更多的并发用户以及存储更多的数据,你需要越来越好的服务器,更好的CPU、更多的内存、更大的磁盘来维护所有表。然而,好的服务器意味着更加复杂、私有、并且也更加昂贵。这与Web/应用层所使用的便宜的硬件形成了鲜明的对比。

    3.动态模式

    关系型数据库需要在添加数据前先定义好模式。比如说,你需要存储客户的电话号码、姓名、地址、城市与州等信息,SQL数据库需要提前知晓你要存的是什么。这对于敏捷开发模式来说是场灾难,因为每次完成新特性时,数据库的模式通常都需要改变。因此,如果在开发过程中想将客户喜欢的条目加到数据库中,那就得向表中添加这一列才行,然后要做的就是将整个数据库迁移到新的模式上。

    4.自动分片

    由于是结构化的,关系型数据库通常会垂直扩展,单台服务器要持有整个数据库来确保可靠性与数据的持续可用性。这样做的代价就是非常昂贵、扩展受到限制,并且数据库基础设施会成为失败点。这个问题的解决方案就是水平扩展,添加服务器而不是为单台服务器增加更多的能力。NoSQL数据库通常都支持自动分片,这意味着他们本质上就会自动在多台服务器上分发数据,应用甚至都不知道这些事情。数据与查询负载会自动在多台服务器上做到平衡,当某台服务器当机时,它能快速且透明地被替换掉。

    5.复制

    大多数NoSQL数据库也支持自动复制,这意味着你可以获得高可用性与灾备恢复功能。从开发者的角度来看,存储环境本质上是虚拟化的。

    NoSQL数据库面临的挑战

    1.成熟度

    RDBMS系统由来已久。NoSQL拥护者们会说RDBMS的高龄是其衰退的标志,不过对于大多数CIO来说,RDBMS的成熟让人放心。对于大多数情况来说,RDBMS系统是稳定且功能丰富的。相比较而言,大多数NoSQL数据库则还有很多特性有待实现。

    2.支持

    企业需要的是安心,如果关键系统出现了故障,他们可以获得即时的支持。所有RDBMS厂商都在不遗余力地提供良好的企业支持。与之相反,大多数NoSQL系统都是开源项目,虽然每种数据库都有那么几家公司提供支持,不过这些公司大多都是小的初创公司,没有全球支持资源,也没有Oracle、微软或是IBM那种令人放心的公信力。

    3.分析与商业智能

    NoSQL数据库在Web 2.0应用时代开始出现。因此,大多数特性都是面向这些应用的需要的。然而,应用中的数据对于业务来说是有价值的,这种价值远远超出了Web应用那种CRUD。企业数据库中的业务信息可以帮助改进效率并提升竞争力,商业智能对于大中型企业来说是个非常关键的IT问题。

    4.管理

    NoSQL的设计目标是提供零管理的解决方案,不过当今的现实却离这个目标还相去甚远。现在的NoSQL需要很多技巧才能用好,并且需要不少人力、物力来维护。

    5.专业

    全球有很多开发者,每个业务部门都会有熟悉RDBMS概念与编程的人。相反,几乎每个NoSQL开发者都处于学习模式。这种状况会随着时间的流逝而发生改观。但现在,找到一个有经验的RDBMS程序员或是管理员要比NoSQL专家容易多了。

    结论

    NoSQL数据库正在成为数据库领域的重要力量。如果使用恰当,那么它会带来很多好处。然而,企业应该非常小心并注意到这些数据库的限制与问题。

    NoSQL这两年越来越热,尤其是大型互联网公司非常热衷这门技术。根据笔者的经验,并不是任何场景,NoSQL都要优于关系型数据库。下面我们来具体聊聊,什么时候使用NoSQL比较给力:

    1) 数据库表schema经常变化 
    比如在线商城,维护产品的属性经常要增加字段,这就意味着ORMapping层的代码和配置要改,如果该表的数据量过百万,新增字段会带来额外开销(重建索引等)。NoSQL应用在这种场景,可以极大提升DB的可伸缩性,开发人员可以将更多的精力放在业务层。

    2)数据库表字段是复杂数据类型

    对于复杂数据类型,比如SQL Sever提供了可扩展性的支持,像xml类型的字段。很多用过的同学应该知道,该字段不管是查询还是更改,效率非常一般。主要原因是是DB层对xml字段很难建高效索引,应用层又要做从字符流到dom的解析转换。NoSQL以json方式存储,提供了原生态的支持,在效率方便远远高于传统关系型数据库。

    3)高并发数据库请求

    此类应用常见于web2.0的网站,很多应用对于数据一致性要求很低,而关系型数据库的事务以及大表join反而成了”性能杀手”。在高并发情况下,sql与no-sql的性能对比由于环境和角度不同一直是存在争议的,并不是说在任何场景,no-sql总是会比sql快。有篇article和大家分享下,http://artur.ejsmont.org/blog/content/insert-performance-comparison-of-nosql-vs-sql-servers

    4)海量数据的分布式存储

    海量数据的存储如果选用大型商用数据,如Oracle,那么整个解决方案的成本是非常高的,要花很多钱在软硬件上。NoSQL分布式存储,可以部署在廉价的硬件上,是一个性价比非常高的解决方案。Mongo的auto-sharding已经运用到了生产环境。http://www.mongodb.org/display/DOCS/Sharding

    并不是说NoSQL可以解决一切问题,像ERP系统、BI系统,在大部分情况还是推荐使用传统关系型数据库。主要的原因是此类系统的业务模型复杂,使用NoSQL将导致系统的维护成本增加。

    为什么要使用NoSQL

    NoSQL概念 
    随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)

    NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。在NoSQL概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于web互联网应用。比如cdb、qdbm、bdb数据库。

    传统关系数据库的瓶颈 
    传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。

    在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。

    到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。

    Memcached+MySQL 
    后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。

    Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。当时,如果你去面试,你说你有Memcached经验,肯定会加分的。

    Mysql主从读写分离 
    由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。

    分表分库 
    随着web2.0的继续高速发展,在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证。

    MySQL的扩展性瓶颈 
    在互联网,大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。

    MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。

    关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。

    NOSQL的优势

    易扩展 
    NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。

    大数据量,高性能 
    NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。

    灵活的数据模型 
    NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。

    高可用 
    NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。

    总结 
    NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。 
    MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL关注在存储上。

    关系数据库还是NoSQL数据库

    上一篇简单的说明了为什么要使用NoSQL。接下来我们看下如何把NoSQL引入到我们的项目中,我们到底要不要把NoSQL引入到项目中。

    在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发。因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库。在高速发展的WEB2.0时代,我们发现关系数据库在性能、扩展性、数据的快速备份和恢复、满足需求的易用性上并不总是能很好的满足我们的需要,我们越来越趋向于根据业务场景选择合适的数据库,以及进行多种数据库的融合运用。几年前的一篇文章《One Size Fits All - An Idea Whose Time Has Come and Gone》就已经阐述了这个观点。

    当我们在讨论是否要使用NoSQL的时候,你还需要理解NoSQL也是分很多种类的,在NoSQL百花齐放的今天,NoSQL的正确选择比选择关系数据库还具有挑战性。虽然NoSQL的使用很简单,但是选择却是个麻烦事,这也正是很多人在观望的一个原因。

    NoSQL的分类

    NoSQL仅仅是一个概念,NoSQL数据库根据数据的存储模型和特点分为很多种类。 
    这里写图片描述

    以上NoSQL数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分。它们之间没有绝对的分界,也有交差的情况,比如Tokyo Cabinet / Tyrant的Table类型存储,就可以理解为是文档型存储,Berkeley DB XML数据库是基于Berkeley DB之上开发的。

    NoSQL还是关系数据库 
    虽然09年出现了比较激进的文章《关系数据库已死》,但是我们心里都清楚,关系数据库其实还活得好好的,你还不能不用关系数据库。但是也说明了一个事实,关系数据库在处理WEB2.0数据的时候,的确已经出现了瓶颈。

    那么我们到底是用NoSQL还是关系数据库呢?我想我们没有必要来进行一个绝对的回答。我们需要根据我们的应用场景来决定我们到底用什么。

    如果关系数据库在你的应用场景中,完全能够很好的工作,而你又是非常善于使用和维护关系数据库的,那么我觉得你完全没有必要迁移到NoSQL上面,除非你是个喜欢折腾的人。如果你是在金融,电信等以数据为王的关键领域,目前使用的是Oracle数据库来提供高可靠性的,除非遇到特别大的瓶颈,不然也别贸然尝试NoSQL。

    然而,在WEB2.0的网站中,关系数据库大部分都出现了瓶颈。在磁盘IO、数据库可扩展上都花费了开发人员相当多的精力来优化,比如做分表分库(database sharding)、主从复制、异构复制等等,然而,这些工作需要的技术能力越来越高,也越来越具有挑战性。如果你正在经历这些场合,那么我觉得你应该尝试一下NoSQL了。

    选择合适的NoSQL 
    如此多类型的NoSQL,而每种类型的NoSQL又有很多,到底选择什么类型的NoSQL来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:

    1.数据结构特点。包括结构化、半结构化、字段是否可能变更、是否有大文本字段、数据字段是否可能变化。

    2.写入特点。包括insert比例、update比例、是否经常更新数据的某一个小字段、原子更新需求。

    3.查询特点。包括查询的条件、查询热点的范围。比如用户信息的查询,可能就是随机的,而新闻的查询就是按照时间,越新的越频繁。

    NoSQL和关系数据库结合 
    其实NoSQL数据库仅仅是关系数据库在某些方面(性能,扩展)的一个弥补,单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足,所以选择NoSQL的原因并不在功能上。

    所以,我们一般会把NoSQL和关系数据库进行结合使用,各取所长,需要使用关系特性的时候我们使用关系数据库,需要使用NoSQL特性的时候我们使用NoSQL数据库,各得其所。

    举个简单的例子吧,比如用户评论的存储,评论大概有主键id、评论的对象aid、评论内容content、用户uid等字段。我们能确定的是评论内容content肯定不会在数据库中用where content=’’查询,评论内容也是一个大文本字段。那么我们可以把 主键id、评论对象aid、用户id存储在数据库,评论内容存储在NoSQL,这样数据库就节省了存储content占用的磁盘空间,从而节省大量IO,对content也更容易做Cache。

    //从MySQL中查询出评论主键id列表 commentIds=DB.query(“SELECT id FROM comments where aid=’评论对象id’ LIMIT 0,20”); //根据主键id列表,从NoSQL取回评论实体数据 CommentsList=NoSQL.get(commentIds);NoSQL代替MySQL 
    在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session会话存储等等,用NoSQL完全可以替代MySQL存储。不但具有更高的性能,而且开发也更加方便。

    NoSQL作为缓存服务器 
    MySQL+Memcached的架构中,我们处处都要精心设计我们的缓存,包括过期时间的设计、缓存的实时性设计、缓存内存大小评估、缓存命中率等等。

    NoSQL数据库一般都具有非常高的性能,在大多数场景下面,你不必再考虑在代码层为NoSQL构建一层Memcached缓存。NoSQL数据本身在Cache上已经做了相当多的优化工作。

    Memcached这类内存缓存服务器缓存的数据大小受限于内存大小,如果用NoSQL来代替Memcached来缓存数据库的话,就可以不再受限于内存大小。虽然可能有少量的磁盘IO读写,可能比Memcached慢一点,但是完全可以用来缓存数据库的查询操作。

    规避风险 
    由于NoSQL是一个比较新的东西,特别是我们选择的NoSQL数据库还不是非常成熟的产品,所以我们可能会遇到未知的风险。为了得到NoSQL的好处,又要考虑规避风险,鱼与熊掌如何兼得?

    现在业内很多公司的做法就是数据的备份。在往NoSQL里面存储数据的时候还会往MySQL里面存储一份。NoSQL数据库本身也需要进行备份(冷备和热备)。或者可以考虑使用两种NoSQL数据库,出现问题后可以进行切换(避免出现digg使用Cassandra的悲剧)。

    总结 
    本文只是简单的从MySQL和NoSQL的角度分析如何选择,以及进行融合使用。其实在选择NoSQL的时候,你可能还会碰到关于CAP原则,最终一致性,BASE思想的考虑。因为使用MySQL架构的时候,你也会碰到上面的问题,所以这里没有阐述。

    展开全文
  • (一)二者间的关系探究  目前在机械工程系统中体现了一些不稳定性,为了正确描述这种输入与输出之间的非线性关系,一般能够选取三种手段:使用物理方程建立关系式;运用经验和理论建立准则库;联合实践,积累经验...
  • Spring-bean之间的关系

    千次阅读 2017-08-02 08:31:26
    总结概述不但可以通过引用另外一个bean,建立起Bean和Bean之间的依赖关系, bean元素标签之间也可以建立类似的关系,完成一些特殊的功能。在Spring容器中,两个Bean之间 除了注入关系外,还存在 继承、依赖、引用 三...
  • 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性...
  • 《为什么:因果关系的新科学》(The Book of Why: The New Science of Cause and Effect)是今年3月刚出版的新书,作者是一位传奇人物,81岁的计算机科学家和哲学家朱迪亚·珀尔(Judea Pearl)。 这本书的主题是在...
  • 【前端】【请求】什么是websocket?

    千次阅读 2018-05-11 10:08:56
    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有...WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接...
  • 关系数据模型——三个组成部分

    千次阅读 2021-09-04 15:17:03
    关系模型的三个组成部分,是指关系数据模型的数据结构、关系数据模型的操作集合和关系数据模型的完整性约束。 关系数据模型的数据结构 主要描述数据的类型、内容、性质以及数据间的联系等,是目标类型的集合。 目标...
  • 2.什么是关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中...
  • java 类之间的依赖关系 -------转

    千次阅读 2019-02-27 10:49:37
    分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过...
  • 图灵测试,测的到底是什么

    千次阅读 2016-03-20 17:11:12
    2014年6月7日发生了一件事情:聊天程序“尤金·古斯特曼”(Eugene Goostman)在英国皇家学会举行的2014图灵测试大会上冒充一个13岁乌克兰男孩而骗过了33%的评委,从而按照图灵当初的定义,“通过...说明了什么问题呢?
  • 男女之间的亲密关系是能量最大、张力最强的,因此冲突也最大,也最让人心碎。 你的亲密关系伴侣,是来帮助你更加认识自己,进而疗愈你的创伤,最终找回真正的自己,因此,亲密关系是通往我们灵魂的桥梁。 在恋爱初期...
  • UML 用例图 、类图 及其之间的关系

    万次阅读 2019-04-15 11:51:57
    1、什么是用例图  用例图源于Jacobson的OOSE方法,用例图是需求分析的产物,描述了系统的参与者与系统进行交互的功能,是参与者所能观察和使用到的系统功能的模型图。它的主要目的就是帮助开发团队以一种可视化的...
  • UML图中类之间的关系

    万次阅读 2018-01-11 19:09:18
    2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性...
  • 声明:本文转至Big大鸟的博客下,转载的名为《什么叫大数据 大数据的概念》一文,链接地址http://blog.csdn.net/qq_36738482/article/details/728235091、大数据定义 对于“大数据”(Big data)研究机构Gartner给...
  • AOP和动态代理之间的关系

    千次阅读 2019-08-08 10:51:57
    1.什么是AOP AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。 在传统的业务处理代码中,通常都会进行事务...
  • 本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系!准备:首先我们创建一列sex。再为部分行设置好值0(女)或者1(男);delete from stud where age=26; 删除年龄为26的行。 ...
  • 什么是SAP HANA?

    万次阅读 2019-04-05 23:37:04
    1. HANA到底是什么? 提到SAP HANA,很多人的第一印象会是“内存计算”,确实如此,内存计算是HANA的最大特色之一。但HANA到底是什么呢?HANA是数据库吗?相较于Oracle、DB2、MS SQL Server等传统型数据库,HANA的...
  • 什么k8s天然适合微服务?

    万次阅读 2018-08-09 20:24:41
    最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样。 经过一段时间的思索,以及采访了从早期就开始实践 ...
  • 什么是GPU?跟CPU有什么区别?终于有人讲明白了

    万次阅读 多人点赞 2020-01-28 11:05:00
    当芯片的集成度增加后,漏电流也随之增大,但时钟频率的提高有限,而且晶体管的线宽很快就会到达物理极限,因此芯片的性能很难靠减小晶体管线宽来提高。于是,人们开始在设计上做文章, 首先想到的是让多个处理器...
  • 常见的关系型数据库(最全收录)

    万次阅读 2018-07-25 15:58:45
    Oracle是1983年推出的世界上第一个开放式商品化关系型数据库管理系统。它采用标准的SQL结构化查询语言,支持多种数据类型,提供面向对象存储的数据支持,具有第四代语言开发工具,支持Unix、Windows NT、OS/2、...
  • UML关联关系

    千次阅读 2012-07-06 10:49:53
    UML中的关联关系其内在意思就是has a 相对于依赖关系,关联关系在代码中有所体现.上图中的关联关系在代码中体现为 其中water 中将Climate作为其中的属性. 当然,关联关系中也有双相关联     关联又分为组合,...
  • 点阵、基元和晶体结构之间的关系

    千次阅读 2019-12-06 21:45:03
    点阵、基元和晶体结构的关系可以表示为:晶体结构=基元+点阵 基元:构成晶体的原子、分子、... 各个结构基元相互之间不但化学内容完全相同, 而且它们所处的环境也必须完全相同. 每个结构基元可以用一个数学上的点来...
  • mySQL(关系型数据库管理系统)编辑

    万次阅读 2014-11-05 18:35:24
    收藏 2906 1034 ...mySQL(关系型数据库管理系统)编辑 ...MySQL[1] 是一个关系型数据库管理系统,由瑞典MySQL ...MySQL是最流行的关系型数据库管理系统,在... Database Management System:关系数据库管理系统)应用
  • 一 cpu个数、核数、线程数的关系 cpu个数:是指物理上,也及硬件上的核心数; 核数:是逻辑上的,简单理解为逻辑上模拟出的核心数; 线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数 二 cpu...
  • 关系数据模型需要指明存取路径,而用SQL进行数据操作时,只要提出“做什么”,而无须指明“怎么做”,数据的存取由系统自动完成。这不但大大减少了用户负担,而且有利于 提高数据独立性。 (3) 面向集合 : 非...
  • UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合) 继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,710
精华内容 39,484
关键字:

不但而且是什么关系