为您推荐:
精华内容
最热下载
问答
  • 5星
    5.68MB pitepa 2021-06-29 16:21:42
  • 5星
    92.48MB zxf2hy 2021-09-24 15:08:00
  • 5星
    1.9MB feijiaogu7393 2021-03-17 15:02:59
  • 5星
    15.33MB zuoan1993 2021-05-10 10:36:55
  • 5星
    21.37MB weixin_43959833 2021-03-27 15:06:27
  • 5星
    35.64MB weixin_43959833 2021-06-16 23:25:22
  • 5星
    8.8MB weixin_47723732 2021-04-19 11:45:51
  • 5星
    520.23MB qq_17695025 2021-06-22 22:46:49
  • 4星
    552KB weixin_44573410 2021-03-30 23:05:47
  • 5星
    552KB weixin_43959833 2021-03-27 20:42:04
  • 823KB weixin_38731761 2021-05-21 05:53:45
  • 33KB weixin_42121272 2021-04-05 00:40:00
  • 459KB weixin_38670707 2021-05-24 19:40:09
  • 797KB weixin_38704284 2021-04-27 21:08:55
  • 1. 引言 最早接触知识图谱是在一篇分析人工智能的文章,文章提出一个很有意思的观点:“在感知层面,人工智能进步很大,在更高级的认知层面,我们现在了解的仍然很少。” 我对这句话的粗浅理解是,人工智能在学习...

    1. 引言

        最早接触知识图谱是在一篇分析人工智能的文章,文章提出一个很有意思的观点:“在感知层面,人工智能进步很大,在更高级的认知层面,我们现在了解的仍然很少。” 我对这句话的粗浅理解是,人工智能在学习数据的内在表示(无监督学习),或者对数据的输出结果判别方面表现出了强大的能力,甚至在计算机视觉、语音识别、机器翻译等方面接近或超过人类的表现水平,但这些都还停留在对数据内容的归纳和感知层面,对于需要复杂背景知识和前后上下文的认知和推理层面了解仍然不够,例如我有一堆数据,我想让机器自己学习和推理出正确的知识,以及知识和知识的联系。当然知识图谱也知识在认知计算领域走出了一步,远未达到人们对认知的期望。

          具体到知识图谱,简单理解就是一个知识库,我们能利用这个知识库,给定你要查询的内容,然后到知识库中去进行关联分析和推理,试图让机器了解你的意图,反馈和你查询相关内容的更多关联信息。举一个简单例子,我们用所有的菜谱构建知识图谱,然后问“夏天西红柿怎么做汤”,知识图谱会查询“夏天”、“‘西红柿”和“汤”在所有菜谱中的直接和间接关系,进而推荐给你几个最匹配的菜谱。就我的总结,知识图谱有两大类主要应用:a) 搜索和问答类型的场景;b)自然语言理解类的场景。典型的应用场景如下:


    那知识图谱是怎么表示的呢?大多数知识图谱用RDF(Resource Description Framework)表示,RDF表征了实体和实体的关系,这种关系有两种:一种是属性关系,即一个实体是另一个实体的属性;另一种是外部关系,表明两个实体之间存在外部关联。。RDF形式上表示为SPO(Subject Predicate Object)三元组,所以实体通过关系链接成无向的网络。例如:


    2. 知识图谱的架构体系

    可以用知名的知识图谱平台PlantData为例,介绍知识图谱的架构体系:


    从图中我们可以看出知识图谱的体系分成4个过程:数据采集、知识抽取、知识链接和融合、知识的应用。

        首先说数据采集,构建知识图谱是以大量的数据为基础的,需要进行大规模的数据采集,采集的数据来源一般是:网络上的公开数据、学术领域的已整理的开放数据、商业领域的共享和合作数据,这些数据可能是结构化的、半结构化的或者非结构化的,数据采集器要适应不同类型的数据。

        知识抽取是对数据进行粗加工,将数据提取成实体-关系三元组,根据数据所在的问题领域,抽取方法分成开放支持抽取和专有领域知识抽取。

        知识链接和融合,由于表征知识的实体-关系三元组抽取自不同来源的数据,可能不同的实体可以进一步融合成新的实体,实现在抽象层面的融合;根据融合之后的新实体,三元组集合可以进一步学习和推理,将表达相同或相似含义的不同关系合并成相同关系,检测相同实体对之间的关系冲突等。

        知识图谱构建完成之后,形成了一个无向图网络,可以运用一些图论方法进行网络关联分析,将其用于文档、检索以及智能决策等领域。例如,阿里的知识图谱以商品、标准产品、 标准品牌、 标准条码、标准分类为核心, 利用实体识别、实体链指和语义分析技术,整合关联了例如舆情、百科、国家行业标准等9大类一级本体,包含了百亿级别的三元组,形成了巨大的知识网,然后将商品知识图谱广泛地应用于搜索、前端导购、平台治理、智能问答、品牌商运营等核心、创新业务。

    3. 知识图谱的构建

        知识图谱的构建有两大类方法:如果知识领域比较贴近开放领域,可以先从网络上找一个开放知识图谱,然后以此为基础进行扩充;如果知识领域只某个专有行业的,例如信息安全领域,则开发知识图谱图谱中可直接使用的知识表示相对较少,需要花更多的精力构建专业的知识图谱,一个典型的工具是Deepdive允许通过机器学习和人工参与的方式不断迭代提升知识图谱。

        不管构建哪一类的知识图谱,都要经历:数据收集、信息抽取、链接和融合数据、数据可视化以及分析等过程。目前中国的知识图谱从业者们建立了一个非常好的开放知识图谱共享网站:OpenKG.CN,网址是:http://www.openkg.cn/,网站的主要内容如下:


    其中,“数据”栏目里给出了开源知识图谱或者用于构建知识图谱的专业数据集。“工具”栏目里给出了几十种用于自然语言处理、知识抽取、知识存储、知识表示、知识链接、知识推理、知识查询、对话系统等用于构建知识图谱和应用知识图谱的工具。“成员”里列出了参与的科研机构和知识图谱从业企业单位。    

        我们可以利用OpenKG.CN里提供的数据集和工具帮助我们构建知识图谱。数据集可以帮助我们建立一个知识图谱的初始版本,即从里面获得初始的知识表示:SPO三元组,然后根据我们收集的真实业务数据再进行知识抽取和知识推理。构建知识图谱的前提是收集数据,收集的数据越全面,则可供提取的知识表示越丰富,知识图谱的用处越大。

    3.1 数据收集

            收集数据的方法包括:

                   a) 收集通用的百科知识,包括百度百科、维基百科等;

                b)收集自然语言处理或者类似OpenKG.CN这类网站提供的公开数据集,例如自然语言处理的语料库、同义词近义词库,OpenKG.CN提供的疾病、菜谱、人物、商品、音乐、企业年报、突发事件、脑科学、中文地理、中医药等领域的数据集;

                   c) 业务领域的数据,从业者所在的企业或者机构所能获取的问题领域的数据。

            以上数据的规模较大,需要一个大数据平台来支撑数据的收集、存储和查询,例如利用Hadoop系统或者单独的非关系数据库(Redis、Mongodb、Hbase和postgresql等数据库)进行存储。

    3.2 知识抽取(生成SPO三元组)

            收集数据之后需要对数据进行处理,这里面最有价值的首先是文本数据,因此要用到自然语言处理,基本的过程是:语言分词、词性标注、命名实体识别、句法分析,更高级写的应用还包括语义依存分析。对于构建知识库而言,自然语言处理的目的是获取命名实体,再根据命名实体和句法分析抽取知识三元组SPO。自然语言处理有两个强大的工具NLTK和Standford NLP,由于Standford NLP提供了开放信息抽取OpenIE功能用于提取三元组SPO,所以使用Standford NLP更贴合知识图谱构建任务,比较麻烦的一点是Standford NLP需要的计算资源和内存较大(推荐内存4GB),启动时间较长,分析效率低于NLTK,不过支持文件列表的输入方式,实现一次多文件输入得到多个文件的输出结果,总体效率还好。当然研究者也开发和共享了更多的知识抽取工具,例如OpenKG.CN里除了Standford NLP还提供了Reverb: 开放三元组抽取、SOFIE: 抽取链接本体及本体间关系、OLLIE:开放三元组知识抽取等工具。

    3.2.1 DeepDive

            以上知识抽取工具有一个共同的缺点是:利用别人训练好的模型、按照给定的模式进行抽取,对于开放领域的知识抽取,可能是足够的。但对于专业领域,例如某个特定行业的知识抽取,可能提供的工具并没有覆盖到该行业领域,此时该工具进行知识抽取的准确率是比较低的,需要一个能够根据你自己收集的业务数据,自适应的更新知识抽取的模型,通过不断迭代的方式逐渐提升知识抽取的准确性,这个迭代过程要允许人工参与。Deepdive是一款被广泛使用的知识抽取开源工具,DeepDive (http://deepdive.stanford.edu/) 是斯坦福大学开发的信息抽取系统,能处理文本、表格、图表、图片等多种格式的无结构数据,从中抽取结构化的信息。系统集成了文件分析、信息提取、信息整合、概率预测等功能。Deepdive在OpenKG.CN上有一个中文的教程:http://openkg1.oss-cn-beijing.aliyuncs.com/478e0087-8dd6-417c-9a49-4ce12f5ec22c/tutorial.pdf
            DeepDive系统的基本输入包括:
                1) 无结构数据,如自然语言文本
                2) 现有知识库或知识图谱中的相关知识
                3) 若干启发式规则
            DeepDive系统的基本输出包括:
                1) 规定形式的结构化知识,可以为关系(实体1,实体2)或者属性(实体,属性值)等形式
                2) 对每一条提取信息的概率预测
        DeepDive系统运行过程中还包括一个重要的迭代环节,即每轮输出生成后,用户需要对运行结果进行错误分析,通过特征调整、更新知识库信息、修改规则等手段干预系统的学习,这样的交互与迭代计算能使得系统的输出不断得到改进。

            DeepDive系统架构和工作流程:


            DeepDive主要针对关系抽取,在指定的关系抽取中效果比较理想,在实体确定后可以很好地进行关系抽取。同时也支持中文关系抽取,仅需要引入中文相关的基础处理工具即可(详情参考:http://www.openkg.cn/tool/cn-deepdive)。不足之处在于未提供专门的针对概念、实体和事件抽取的支持,同时需要大量的标注语料支持,并通过人工设置标注规则



            总结一下,知识三元组的抽取,对于开放领域的信息抽取直接使用现有OpenIE工具,对于特定行业领域内的信息抽取,需要使用类似Deepdive这样的工具,在内部集成自然语言处理工具、实体识别工具、实体对之间的关系抽取、人工标注修正错误等步骤。实体识别工具可以直接用资源语言处理领域的命名实体识别NER工具,也可以根据从外部或者人工提取的知识库进行实体匹配,最难做的是实体对之间的关系抽取。Deepdive对实体对之间的关系通过弱监督训练和预测的方法,具体步骤是

            a) 先通过启发式规则的方式标注一部分实体对之间的关系作为监督学习的标记;

            b) 对每个实体对所在的文本进行特征提取生成监督学习的特征向量;

          c) 根据启发式规则的标注对所有已标实体对所在文本的特征向量进行监督学习的训练过程生成预测模型,再根据预测模型预测未标注实体对的关系标签,得到所有候选实体对的关系标签;

            d) 导出所有候选实体对及其关系标签,然后对SPO三元组做人工确认,将人工修改后实体对的关系标记重新导入启发式规则作为监督学习的已标注样本。

      重复以上监督学习的训练、预测过程和人工确认过程,迭代式的实现实体对关系的更新。

           Deepdive中的监督学习是一种远程监督学习技术。为了打破有监督学习中人工数据标注的局限性,Mintz等人提出了远程监督(Distant Supervision)算法,该算法的核心思想是将文本与大规模知识图谱进行实体对齐,利用知识图谱已有的实体间关系对文本进行标注。远程监督基于的基本假设是:如果从知识图谱中可获取三元组R(E1,E2)(注:R代表关系,E1、E2代表两个实体),且E1和E2共现与句子S中,则S表达了E1和E2间的关系R,标注为训练正例。
        远程监督算法是目前主流的关系抽取系统广泛采用的方法,也是该领域的研究热点之一。该算法很好地解决了数据标注的规模问题,但它基于的基本假设过强,会引入大量噪音数据,出现 the wrong label problem 的问题,原因是远程监督假设一个实体对只对应一种关系,但实际上实体对间可以同时具有多种关系,如上例中还存在CEO(乔布斯,苹果公司)的关系,实体对间也可能不存在通常定义的某种关系,而仅因为共同涉及了某个话题才在句中共现。
        为了减小 the wrong label problem 的影响,学术界陆续提出了多种改进算法,主要包括:
        a) 基于规则的方法:通过对wrong label cases的统计分析,添加规则,将原本获得正例标注的wrong label cases直接标为负例,或通过分值控制,抵消原有的正标注。
         b) 基于图模型的方法:构建因子图(factor graph)等能表征变量间关联的图模型,通过对特征的学习和对特征权重的推算减小wrong label cases对全局的影响。

        c) 基于多示例学习(multi-instance learning)的方法:将所有包含(E1,E2)的句子组成一个bag,从每个bag对句子进行筛选来生成训练样本。

        除了Deepdive的关系抽取技术,基于深度学习的关系技术也很流行。两种方法相辅相成,各有优势:DeepDive系统较多依赖于自然语言处理工具和基于上下文的特征进行抽取,在语料规模的选择上更为灵活,能进行有针对性的关系抽取,且能方便地在抽取过程中进行人工检验和干预;而深度学习的方法主要应用了词向量和卷积神经网络,在大规模语料处理和多关系抽取的人物中有明显的优势。

    4. 知识图谱的应用

    4.1 进行图分析

    列举一些我们常用的图算法:
    1. 图遍历:广度优先遍历、深度优先遍历
    2. 最短路径查询: Dijkstra(迪杰斯特拉算法)、Floyd(弗洛伊德算法)
    3. 路径探寻:给定两个或多个节点,发现它们之间的关联关系
    4. 权威节点分析:PageRank算法
    5. 族群发现:最大流算法
    6. 相似节点发现:基于节点属性、关系的相似度算法
    其中,权威节点分析做过社交网络分析的人应该都知道,可以用来做社交网络里的权威人物分析,我们在创投知识图谱中用来做权威投资机构的发现。族群发现算法一般用来在社交网络中主题社区的发现,在这里我们同样可以用来识别企业知识图谱中的派系(阿里系、腾讯系)。相似节点发现应用就更加广泛了,在企业知识图谱中可以做相似企业的发现,这里有个很重要的实际应用场景,可以利用相似企业进行精准的获客营销。

    4.2 基于本体的推理

        基于本体的知识推理应用也非常的多,比如我们在实际场景中的冲突检测。因为不管是手动构建,还是自动构建知识图谱,都会碰到这样一个问题:或者数据来源不同,或者构建的人员不同、方法不同,这就会不可避免的导致一些冲突,这些冲突自身很难直观的去发现,但是可以利用知识图谱里面的冲突检测去发现存在的有矛盾的、有冲突的知识。
    本体推理基本方法包括:
    • 基于表运算及改进的方法:FaCT++、Racer、 Pellet Hermit等
    • 基于一阶查询重写的方法(Ontology based data access,基于本体的数据访问)
    • 基于产生式规则的算法(如rete):Jena 、Sesame、OWLIM等
    • 基于Datalog转换的方法如KAON、RDFox等
    • 回答集程序 Answer set programming
    OpenKG.CN上有一些知识推理的工具,例如:http://www.openkg.cn/tool?tags=%E7%9F%A5%E8%AF%86%E6%8E%A8%E7%90%86

    4.3 基于规则的推理

            基于规则的推理是在知识图谱基础知识的基础上,专家依据行业应用的业务特征进行规则的定义,这在业务应用中是非常常见的。基于规则的推理是在知识图谱基础知识的基础上,专家依据行业应用的业务特征进行规则的定义,这在业务应用中是非常常见的。介绍一下我们常用的Drools(因被JBOSS收购,现已更名为JBoss Rules),它是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现,使用了OO接口的RETE,使得商业规则有了更自然的表达,其推理的效率也比较高。 结合规则引擎工具,基于基础知识与所定义的规则,执行推理过程给出推理结果。

    4.4 可视化辅助决策

            首先介绍两个比较常见的可视化工具D3.js和ECharts。 D3.js全称Data-Driven Documents,是一个用动态图形显示数据的JavaScript库,一个数据可视化工具,它提供了各种简单易用的函数,大大方便了数据可视化的工作。
            ECharts是一款由百度前端技术部开发的,同样基于Javascript的数据可视化图标库。它提供大量常用的数据可视化图表。对于出入门的知识图谱使用者,推荐两个入门级别的开源的知识图谱展示工具:
            a) 知识图谱Demo,Demo的详细介绍:
                https://zhuanlan.zhihu.com/p/29332977?group_id=891668221558661120
                开源代码网址:
                https://github.com/Shuang0420/knowledge_graph_demo
                生成的图谱展示结果如下:

            b) 农业知识图谱(KG):农业领域的信息检索,命名实体识别,关系抽取,分类树构建,数据挖掘。

                开源代码网址:

                https://github.com/qq547276542/Agriculture_KnowledgeGraph

                知识图谱的Demo展示网址:

                http://ecnukg.vicp.io/

                展示效果如下:

                

           

    更深入的应用或则展示可以参考商业知识图谱平台PlantData,网址是:https://wx.jdcloud.com/shop/shopDetail/HiKnowledge

    4.5 问答系统

       这里介绍一个OpenKG.CN的问答demo:基于 REfO 的 KBQA 实现及示例

        网址是:http://www.openkg.cn/tool/refo-kbqa,这是一个基于 Python 模块 REfO 实现的知识库问答初级系统. 该问答系统可以解析输入的自然语言问句生成 SPARQL 查询,进一步请求后台基于 TDB 知识库的 Apache Jena Fuseki 服务, 得到结果。这是一个入门级的例子. 内含介绍此项目的 README.pdf. 方便用户快速把握这个项目的想法. 希望用户体会默认的 3 类 5 个问题. 不同的表述能够用统一的"对象正则表达式"匹配得到结果, 进而生成对应 SPARQL 查询语句。

           知识库由大量的三元组组成,并且这些三元组的实体和实体关系都是形式化的语言给定一个自然语言的问题“Where was Obama born?” 我们面临的第一个挑战,就是如何建立问题到知识库的映射?语义解析KB-QA的思路是通过对自然语言进行语义上的分析,转化成为一种能够让知识库“看懂”的语义表示即逻辑形式(Logic Form),进而通过知识库中的知识,进行推理(Inference)查询(Query),得出最终的答案。KB-QA的详细介绍,可以参考知乎专栏:“揭开知识库问答KB-QA的面纱”。

        由于个人对知识图谱的理解也比较浅显,本文只是记录自己的一些平时整理的知识和经验,方便自己以后查询和深入学习。

    展开全文
    zourzh123 2018-07-12 10:38:29
  • 自然语言处理(NLP)是一种艺术与科学的结合,旨在从文本数据中提取信息。在它的帮助下,我们从文本中提炼出适用于计算机算法的信息。从自动翻译、文本分类到情绪分析,自然语言处理成为所有数据科学家的必备技能之...

    原文

    该作者也是翻译的外文,英文原文链接

    引言

    自然语言处理(NLP)是一种艺术与科学的结合,旨在从文本数据中提取信息。在它的帮助下,我们从文本中提炼出适用于计算机算法的信息。从自动翻译、文本分类到情绪分析,自然语言处理成为所有数据科学家的必备技能之一。

    常见的10个NLP任务如下:

    1. 词干提取
    2. 词形还原
    3. 词向量化
    4. 词性标注
    5. 命名实体消岐
    6. 命名实体识别
    7. 情感分析
    8. 文本语义相似分析
    9. 语种辨识
    10. 文本总结

    以下将详细展开:

    1.词干提取

    什么是词干提取?词干提取是将词语去除变化或衍生形式,转换为词干或原型形式的过程。词干提取的目标是将相关词语还原为同样的词干,哪怕词干并非词典的词目。例如,英文中:

    1. beautiful和beautifully的词干同为beauti
    2. Good,better和best 的词干分别为good,better和best。

    相关论文:Martin Porter的波特词干算法原文

    相关算法:Porter2词干算法的Python实现

    程序实现:Porter2算法做词干提取的代码:

    #!pip install stemming
    from stemming.porter2 import stem
    stem("casually")
    

    2. 词形还原

    什么是词形还原? 词形还原是将一组词语还原为词源或词典的词目形式的过程。还原过程考虑到了POS问题,即词语在句中的语义,词语对相邻语句的语义等。例如,英语中:

    1. beautiful和beautifully被分别还原为beautiful和beautifully。
    2. good, better和best被分别还原为good, good和good

    相关论文1: 这篇文章详细讨论了词形还原的不同方法。想要了解传统词形还原的工作原理必读。

    相关论文2: 这篇论文非常出色,讨论了运用深度学习对变化丰富的语种做词形还原时会遇到的问题。

    数据集: 这里是Treebank-3数据集的链接,你可以使用它创建一个自己的词形还原工具。

    程序实现:下面给出了在spacy上的英语词形还原代码

    #!pip install spacy
    #python -m spacy download en
    import spacy
    nlp=spacy.load("en")
    doc="good better best"
    for token in nlp(doc):
        print(token,token.lemma_)
    

    3. 词向量化

    什么是词向量化?词向量化是用一组实数构成的向量代表自然语言的叫法。这种技术非常实用,因为电脑无法处理自然语言。词向量化可以捕捉到自然语言和实数间的本质关系。通过词向量化,一个词语或者一段短语可以用一个定维的向量表示,例如向量的长度可以为100。

    例如:Man这个词语可以用一个五维向量表示。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-brz0VdBI-1630544238308)(https://github.com/smilelight/images/raw/master/%E5%B8%B8%E8%A7%8110%E7%A7%8D%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E6%8A%80%E6%9C%AF/word-vector.png)]

    这里的每个数字代表了词语在某个特定方向上的量级。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kNpXM4ch-1630544238311)(https://github.com/smilelight/images/raw/master/%E5%B8%B8%E8%A7%8110%E7%A7%8D%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E6%8A%80%E6%9C%AF/Word-Vectors.png)]

    相关博文:这篇文章详细解释了词向量化

    相关论文:这篇论文解释了词向量化的细节。深入理解词向量化必读。

    相关工具:这是个基于浏览器的词向量可视化工具。

    预训练词向量:这里有一份facebook的预训练词向量列表,包含294种语言。

    这里可以下载google news的预训练词向量。

    #!pip install gensim
    from gensim.models.keyedvectors import KeyedVectors
    word_vectors=KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin',binary=True)
    word_vectors['human']
    

    程序实现:这段代码可以用gensim训练你自己的词向量

    sentence=[['first','sentence'],['second','sentence']]
    model = gensim.models.Word2Vec(sentence, min_count=1,size=300,workers=4)
    

    4.词性标注

    什么事词性标注?简单来说,词性标注是对句子中的词语标注为名字、动词、形容词、副词等的过程。例如,对句子“Ashok killed the snake with a stick”,词性标注会识别:

    • Ashok 代词
    • killed 动词
    • the 限定词
    • snake 名词
    • with 连词
    • a 限定词
    • stick 名词
    • . 标点

    论文1:choi aptly的这篇《The Last Gist to theState-of-the-Art 》介绍了一种叫动态特征归纳的新方法。这是目前词性标注最先进的方法。

    论文2:这篇文章介绍了通过隐马尔科夫模型做无监督词性标注学习的方法。

    程序实现:这段代码可以在spacy上做词性标注

    #!pip install spacy
    #!python -m spacy download en 
    nlp=spacy.load('en')
    sentence="Ashok killed the snake with a stick"
    for token in nlp(sentence):
       print(token,token.pos_)
    

    5. 命名实体消歧

    什么是命名实体消岐?命名实体消岐是对句子中的提到的实体识别的过程。例如,对句子“Apple earned a revenue of 200 Billion USD in 2016”,命名实体消岐会推断出句子中的Apple是苹果公司而不是指一种水果。一般来说,命名实体要求有一个实体知识库,能够将句子中提到的实体和知识库联系起来。

    论文1:Huang的这篇论文运用了基于深度神经网络和知识库的深层语义关联模型,在命名实体消岐上达到了领先水平。

    论文2:Ganea and Hofmann的这篇文章运用了局部神经关注模型和词向量化,没有人为设置特征。

    6. 命名实体识别

    体识别是识别一个句子中有特定意义的实体并将其区分为人名,机构名,日期,地名,时间等类别的任务。例如,一个NER会将一个这样的句子:

    “Ram of Apple Inc. travelled to Sydney on 5th October 2017”

    返回如下的结果:

    Ram
    of
    Apple ORG
    Inc. ORG
    travelled
    to
    Sydney GPE
    on
    5th DATE
    October DATE
    2017 DATE

    这里,ORG代表机构组织名,GPE代表地名。

    然而,当NER被用在不同于该NER被训练的数据领域时,即使是最先进的NER也往往表现不佳。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGZYUxW2-1630544238314)(https://github.com/smilelight/images/raw/master/%E5%B8%B8%E8%A7%8110%E7%A7%8D%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E6%8A%80%E6%9C%AF/ner.png)]

    论文:这篇优秀的论文使用双向LSTM(长短期记忆网络)神经网络结合监督学习和非监督学习方法,在4种语言领域实现了命名实体识别的最新成果。

    程序实现:以下使用spacy执行命名实体识别。

    import spacy
    nlp=spacy.load('en')sentence="Ram of Apple Inc. travelled to Sydney on 5th October 2017"
    for token in nlp(sentence):
       print(token, token.ent_type_)
    

    7. 情感分析

    什么是情感分析?情感分析是一种广泛的主观分析,它使用自然语言处理技术来识别客户评论的语义情感,语句表达的情绪正负面以及通过语音分析或书面文字判断其表达的情感等等。例如:

    “我不喜欢巧克力冰淇淋”—是对该冰淇淋的负面评价。

    “我并不讨厌巧克力冰激凌”—可以被认为是一种中性的评价。

    从使用LSTMs和Word嵌入来计算一个句子中的正负词数开始,有很多方法都可以用来进行情感分析。

    博文1:本文重点对电影推文进行情感分析。

    博文2:本文重点对印度金奈洪水期间的推文进行情感分析。

    论文1:本文采用朴素贝叶斯的监督学习方法对IMDB评论进行分类。

    论文2:本文利用LDA的无监督学习方法来识别用户生成评论的观点和情感。本文在解决注释评论短缺的问题上表现突出。

    资料库:这是一个很好的包含相关研究论文和各种语言情感分析程序实现的资料库。

    数据集1:多域情感数据集版本2.0

    数据集2:Twitter情感分析数据集

    竞赛:一个非常好的比赛,你可以检查你的模型在烂番茄电影评论的情感分析任务中的表现。

    8. 语义文本相似度

    什么是语义文本相似度分析?语义文本相似度分析是对两段文本的意义和本质之间的相似度进行分析的过程。注意,相似性与相关性是不同的。

    例如:

    汽车和公共汽车是相似的,但是汽车和燃料是相关的。

    论文1:本文详细介绍了文本相似度测量的不同方法。是一篇可以一站式了解目前所有方法的必读文章。

    论文2:本文介绍了用CNN神经网络去比对两个短文本。

    论文3:本文利用Tree-LSTMs方法得到了文本的语义相关和语义分类的最新成果。

    9. 语言识别

    什么是语言识别?语言识别指的是将不同语言的文本区分出来。其利用语言的统计和语法属性来执行此任务。语言识别也可以被认为是文本分类的特殊情况。

    博文:在这篇由fastText撰写的博文中介绍了一种新的工具,其可以在1MB的内存使用情况下识别170种语言。

    论文1:本文讨论了285种语言的7种语言识别方法。

    论文2:本文描述了如何使用深度神经网络来实现自动语言识别的最新成果。

    10. 文本摘要

    什么是文本摘要?文本摘要是通过识别文本的重点并使用这些要点创建摘要来缩短文本的过程。文本摘要的目的是在不改变文本含义的前提下最大限度地缩短文本。

    论文1:本文描述了基于神经注意模型的抽象语句梗概方法。

    论文2:本文描述了使用序列到序列的RNN在文本摘要中达到的最新结果。

    资料库:Google Brain团队的这个资料库拥有使用为文本摘要定制的序列到序列模型的代码。该模型在Gigaword数据集上进行训练。

    应用程序:Reddit的autotldr机器人使用文本摘要来梗概从文章到帖子的各种评论。这个功能在Reddit用户中非常有名。

    程序实现:以下是如何用gensim包快速实现文本摘要。

    from gensim.summarization import summarize
    sentence = "Automatic summarization is the process of shortening a text document with software, in order to create a summary with the major points of the original document. Technologies that can make a coherent summary take into account variables such as length, writing style and syntax.Automatic data summarization is part of machine learning and data mining. The main idea of summarization is to find a subset of data which contains the information of the entire set. Such techniques are widely used in industry today. Search engines are an example; others include summarization of documents, image collections and videos. Document summarization tries to create a representative summary or abstract of the entire document, by finding the most informative sentences, while in image summarization the system finds the most representative and important (i.e. salient) images. For surveillance videos, one might want to extract the important events from the uneventful context.There are two general approaches to automatic summarization: extraction and abstraction. Extractive methods work by selecting a subset of existing words, phrases, or sentences in the original text to form the summary. In contrast, abstractive methods build an internal semantic representation and then use natural language generation techniques to create a summary that is closer to what a human might express. Such a summary might include verbal innovations. Research to date has focused primarily on extractive methods, which are appropriate for image collection summarization and video summarization."
    summarize(sentence)
    

    结束语

    以上所有是最流行的NLP任务以及相关的博客、研究论文、资料库、应用等资源。

    展开全文
    Harrytsz 2021-09-02 08:57:33
  • — Mike Acton, Engine Director at Insomniac Games (观看他在CppCon上的演说) 算法与数据结构 正如几十年来的共识,我们认为,计算机科学教育所赋予人们的最大能量在于对常见算法和数据结构的熟悉。此外,这也...

    原文:https://github.com/keithnull/TeachYourselfCS-CN 

     

    本文档是对TeachYourselfCS内容的中文翻译,原作者为Ozan OnayMyles Byrne。如需了解翻译相关信息或帮助改进翻译,请参见本文档结尾

    This document is a Chinese translation of TeachYourselfCS, which is written by Ozan Onay and Myles Byrne. For more information about this translation, please refer to the end of this document.

    如果你是一个自学成才的工程师,或者从编程培训班毕业,那么你很有必要学习计算机科学。幸运的是,不必为此花上数年光阴和不菲费用去攻读一个学位:仅仅依靠自己,你就可以获得世界一流水平的教育💸。

    互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如“200+免费在线课程”的清单,而是以下问题的答案:

    • 你应当学习哪些科目,为什么?
    • 对于这些科目,最好的书籍或者视频课程是什么?

    在这份指引中,我们尝试对这些问题做出确定的回答。

    简而言之

    大致按照列出的顺序,借助我们所建议的教材或者视频课程(但是最好二者兼用),学习如下的九门科目。目标是先花100到200个小时学习完每一个科目,然后在你职业生涯中,不时温习其中的精髓🚀。

    科目为何要学?最佳书籍最佳视频
    编程不要做一个“永远没彻底搞懂”诸如递归等概念的程序员。《计算机程序的构造和解释》Brian Harvey’s Berkeley CS 61A
    计算机架构如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。《深入理解计算机系统》Berkeley CS 61C
    算法与数据结构如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。《算法设计手册》Steven Skiena’s lectures
    数学知识计算机科学基本上是应用数学的一个“跑偏的”分支,因此学习数学将会给你带来竞争优势。《计算机科学中的数学》Tom Leighton’s MIT 6.042J
    操作系统你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。《操作系统导论》Berkeley CS 162
    计算机网络互联网已然势不可挡:理解工作原理才能解锁全部潜力。《计算机网络:自顶向下方法》Stanford CS 144
    数据库对于多数重要程序,数据是其核心,然而很少人理解数据库系统的工作原理。《Readings in Database Systems》 (暂无中译本)Joe Hellerstein’s Berkeley CS 186
    编程语言与编译器若你懂得编程语言和编译器如何工作,你就能写出更好的代码,更轻松地学习新的编程语言。《Crafting Interpreters》Alex Aiken’s course on Lagunita
    分布式系统如今,多数 系统都是分布式的。《数据密集型应用系统设计》MIT 6.824

    还是太多?

    如果花几年时间自学 9 门科目让人望而却步,我们建议你只专注于两本书:《深入理解计算机系统》 和 《数据密集型应用系统设计》。根据我们的经验,投入到这两本书的时间可以获得极高的回报率,特别适合从事网络应用开发的自学工程师。这两本书也可以作为上面表格中其他科目的纲领。

    为什么要学习计算机科学?

    软件工程师分为两种:一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;另一种仅仅凭着对一些高级工具的熟悉而勉强应付。

    这两种人都自称软件工程师,都能在职业生涯早期挣到差不多的工资。然而,随着时间流逝,第一种工程师不断成长,所做的事情将会越来越有意义且更为高薪,不论是有价值的商业工作、突破性的开源项目、技术上的领导力或者高质量的个人贡献。

    全球短信系统每日收发约200亿条信息,而仅仅靠57名工程师,现在的 WhatsApp 每日收发420亿条。

    — Benedict Evans (@BenedictEvans) 2016年2月2日

    第一种工程师总是寻求深入学习计算机科学的方法,或是通过传统的方法学习,或是在职业生涯中永无止息地学习;第二种工程师 通常浮于表面,只学习某些特定的工具和技术,而不研究其底层的基本原理,仅仅在技术潮流的风向改变时学习新的技能。

    如今,涌入计算机行业的人数激增,然而计算机专业的毕业生数量基本上未曾改变。第二种工程师的供过于求正在开始减少他们的工作机会,使他们无法涉足行业内更加有意义的工作。对你而言,不论正在努力成为第一种工程师,还是只想让自己的职业生涯更加安全,学习计算机科学是唯一可靠的途径。

    23333 然而他们... pic.twitter.com/XVNYlXAHar

    — Jenna Bilotta (@jenna) 2017年3月4日

    分科目指引

    编程

    大多数计算机专业本科教学以程序设计“导论”作为开始。这类课程的最佳版本不仅能满足初学者的需要,还适用于那些在初学编程阶段遗漏了某些有益的概念和程序设计模式的人。

    对于这部分内容,我们的标准推荐是这部经典著作:《计算机程序的构造和解释》。在网络上,这本书既可供免费阅读(英文版),也作为MIT的免费视频课程。不过尽管这些视频课程很不错,我们对于视频课程的推荐实际上是Brian Harvey 开设的 SICP 课程(即 Berkeley 的 61A 课程)。比起MIT的课程,它更加完善,更适用于初学者。

    我们建议至少学完SICP的前三章,并完成配套的习题。如果需要额外的练习,可以去解决一些小的程序设计问题,比如exercism

    中文翻译新增:

    自从 2016 年首次发布这份指南以来,最常被问到的一个问题是,我们是否推荐由 John DeNero 讲授的更新的 CS 61A 课程,以及配套的书籍 《Composing Programs》,这本书“继承自 SICP” 但使用 Python 讲解。我们认为 DeNero 的课程也很不错,有的学生可能更喜欢,但我们还是建议把 SICP, Scheme 和 Brian Harvey 的视频课程作为首选。

    为什么这么说呢?因为 SICP 是独一无二的,它可以——至少很有可能——改变你对计算机和编程的基本认识。不是每个人都有这样的体验。有的人讨厌这本书,有的人看了前几页就放弃了。但潜在的回报让它值得一读。

    如果你觉得SICP过于难,试试 《Composing Programs》。如果还是不合适,那我们推荐 《程序设计方法》(中文版英文版 ;如果你觉得SICP过于简单,那我们推荐 《Concepts, Techniques, and Models of Computer Programming》 。如果读这些书让你觉得没有收获,也行你应该先学习其他科目,一两年后再重新审视编程的理念。

    新版原文删除了对 《Concepts, Techniques, and Models of Computer Programming》 一书的推荐,但这本书对各种编程模型有深入的见解,值得一读。所以译文中依然保留。 — 译者注

    最后,有一点要说明的是:本指南不适用于完全不懂编程的新手。我们假定你是一个没有计算机专业背景的程序员,希望填补一些知识空白。事实上,我们把“编程”章节包括进来只是提醒你还有更多知识需要学习。对于那些从来没有学过编程,但又想学的人来说,这份指南更合适。

    计算机程序的构造和解释

    计算机架构

    计算机架构——有时候又被称为“计算机系统”或者“计算机组成”——是了解软件底层的的重要视角。根据我们的经验,这是自学的软件工程师最容易忽视的领域。

    我们最喜欢的入门书是 《深入理解计算机系统》。典型的计算机体系结构导论课程会涵盖本书的 1 - 6 章。

    我们喜爱《深入理解计算机系统》,因为它的实用性,并且站在程序员的视角。虽然计算机体系结构的内容比本书所涉及的内容多得多,但对于那些想了解计算机系统以求编写更快、更高效、更可靠的软件的人来说,这本书是很好的起点。

    对于那些既想了解这个主题又想兼顾硬件和软件的知识的人来说,我们推荐 《计算机系统要素》,又名“从与非门到俄罗斯方块”(“Nand2Tetris”),这本书规模宏大,让读者对计算机内的所有部分如何协同工作有完全的认识。这本书的每一章节对应如何构建计算机整体系统中的一小部分,从用HDL(硬件描述语言)写基本的逻辑门电路出发,途经CPU和汇编,最终抵达诸如俄罗斯方块这般规模的应用程序。

    我们推荐把此书的前六章读完,并完成对应的项目练习。这么做,你将更加深入地理解,计算机架构和运行其上的软件之间的关系。

    这本书的前半部分(包括所有对应的项目)均可从Nand2Tetris的网站上免费获得。同时,在Coursera上,这是一门视频课程

    为了追求简洁和紧凑,这本书牺牲了内容上的深度。尤其值得注意的是,流水线和存储层次结构是现代计算机架构中极其重要的两个概念,然而这本书对此几乎毫无涉及。

    当你掌握了Nand2Tetris的内容后,我们推荐要么回到《深入理解计算机系统》,或者考虑Patterson和Hennessy二人所著的 《计算机组成与设计》,一本优秀的经典著作。这本书中的不同章节重要程度不一,因此我们建议根据Berkeley的CS61C课程 “计算机架构中的伟大思想”来着重阅读一些章节。这门课的笔记和实验在网络上可以免费获得,并且在互联网档案中有这门课程的过往资料。

    https://book.douban.com/subject/26912767/

     

     计算机系统要素

    硬件是平台。

    — Mike Acton, Engine Director at Insomniac Games (观看他在CppCon上的演说)

    算法与数据结构

    正如几十年来的共识,我们认为,计算机科学教育所赋予人们的最大能量在于对常见算法和数据结构的熟悉。此外,这也可以训练一个人对于各种问题的解决能力,有助于其他领域的学习。

    关于算法与数据结构,有成百上千的书可供使用,但是我们的最爱是Steven Skiena编写的 《算法设计手册》。显而易见,他对此充满热爱,迫不及待地想要帮助其他人理解。在我们看来,这本书给人一种焕然一新的体验,完全不同于那些更加经常被推荐的书(比如Cormen,Leiserson,Rivest 和 Stein,或者 Sedgewick的书,后两者充斥着过多的证明,不适合以 解决问题 为导向的学习)。

    如果你更喜欢视频课程,Skiena慷慨地提供了他的课程。此外,Tim Roughgarden的课程也很不错, 在Stanford的MOOC平台Lagunita,或者Coursera上均可获得。Skiena和Roughgarden的这两门课程没有优劣之分,选择何者取决于个人品味。

    至于练习,我们推荐学生在Leetcode上解决问题。Leetcode上的问题往往有趣且带有良好的解法和讨论。此外,在竞争日益激烈的软件行业,这些问题可以帮助你评估自己应对技术面试中常见问题的能力。我们建议解决大约100道随机挑选的Leetcode问题,作为学习的一部分。

    最后,我们强烈推荐 《怎样解题》。这本书极为优秀且独特,指导人们解决广义上的问题,因而一如其适用于数学,它适用于计算机科学。

    算法设计手册 怎样解题

    我可以广泛推荐的方法只有一个: 写之前先思考。

    — Richard Hamming

    数学知识

    从某个角度说,计算机科学是应用数学的一个“发育过度”的分支。尽管许多软件工程师试图——并且在不同程度上成功做到——忽视这一点,我们鼓励你用学习来拥抱数学。如若成功,比起那些没有掌握数学的人,你将获得巨大的竞争优势。

    对于计算机科学,数学中最相关的领域是“离散数学”,其中的“离散”与“连续”相对立,大致上指的是应用数学中那些有趣的主题,而不是微积分之类的。由于定义比较含糊,试图掌握离散数学的全部内容是没有意义的。较为现实的学习目标是,了解逻辑、排列组合、概率论、集合论、图论以及密码学相关的一些数论知识。考虑到线性代数在计算机图形学和机器学习中的重要性,该领域同样值得学习。

    学习离散数学,我们建议从László Lovász的课程笔记开始。Lovász教授成功地让这些内容浅显易懂且符合直觉,因此,比起正式的教材,这更适合初学者。

    对于更加高阶的学习,我们推荐 《计算机科学中的数学》,MIT同名课程的课程笔记,篇幅与书籍相当(事实上,现已出版)。这门课程的视频同样可免费获得,是我们所推荐的学习视频。

    对于线性代数,我们建议从Essence of linear algebra系列视频开始,然后再去学习Gilbert Strang的《线性代数导论》视频课程

    计算机科学中的数学

    如果人们不相信数学是简单的,那么只能是因为他们没有意识到生活有多么复杂。

    — John von Neumann

    操作系统

    《操作系统概念》 (“恐龙书”)和 《现代操作系统》 是操作系统领域的经典书籍。二者都因为写作风格和对学生不友好而招致了一些批评。

    《操作系统导论》(Operating Systems: Three Easy Pieces) 是一个不错的替代品,并且可在网上免费获得(英文版)。我们格外喜欢这本书的结构,并且认为这本书的习题很值得一做。

    在读完《操作系统导论》后,我们鼓励你探索特定操作系统的设计。可以借助“{OS name} Internals”风格的书籍,比如 Lion's commentary on Unix, The Design and Implementation of the FreeBSD Operating System,以及 Mac OS X Internals。对于 Linux ,我们推荐 Robert Love 的 《Linux内核设计与实现》

    为了巩固对操作系统的理解,阅读小型系统内核的代码并且为其增加特性是一个很不错的方法。比如,xv6,由MIT的一门课程所维护的从Unix V6到ANSI C和x86的移植,就是一个很棒的选择。《操作系统导论》有一个附录,记载了一些可能的xv6实验项目,其中充满了关于潜在项目的很棒想法。

    操作系统导论

    计算机网络

    鉴于有那么多关于网络服务端和客户端的软件工程,计算机网络是计算机科学中价值最为“立竿见影”的领域之一。我们的学生,系统性地学习了计算机网络,最终能够理解那些曾困扰他们多年的术语、概念和协议。

    在这一主题上,我们最爱的书籍是 《计算机网络:自顶向下方法》。书中的小项目和习题相当值得练习,尤其是其中的“Wireshark labs”(这部分在网上可以获得)。

    如果更喜欢视频课程,我们推荐Stanford的Introduction to Computer Networking,可在他们的MOOC平台Lagunita上免费观看。

    对于计算机网络的学习,做项目比完成小的习题更有益。一些可能的项目有:HTTP服务器,基于UDP的聊天APP,迷你TCP栈,代理,负载均衡器,或者分布式哈希表。

    《计算机网络:自顶向下方法》

    你无法盯着水晶球预见未来,未来的互联网何去何从取决于社会。

    — Bob Kahn

    数据库

    比起其他主题,自学数据库系统需要更多的付出。这是一个相对年轻的研究领域,并且出于很强的商业动机,研究者把想法藏在紧闭的门后。此外,许多原本有潜力写出优秀教材的作者反而选择了加入或创立公司。

    鉴于如上情况,我们鼓励自学者大体上抛弃教材,而是从2015年春季学期的CS 186课程(Joe Hellerstein在Berkeley的数据库课程)开始,然后前往阅读论文。

    对于初学者,有一篇格外值得提及的论文:“Architecture of a Database System”。这篇论文提供了独特的对关系型数据库管理系统(RDBMS)如何工作的高层次观点,是后续学习的实用梗概。

    《Readings in Database Systems》,或者以数据库“红书”更为人知,是由Peter Bailis,Joe Hellerstein和Michael Stonebraker编纂的论文合集。对于那些想要在CS 186课程的水平更进一步的学习者,“红书”应当是下一步。

    如果你坚持一定要一本导论教材,那我们推荐Ramakrishnan和Gehrke所著的 《数据库管理系统:原理与设计》。如需更深一步,Jim Gray的经典著作 《Transaction Processing: Concepts and Techniques》 值得一读,不过我们不建议把这本书当作首要资源。

    如果没有编写足够数量的代码,很难巩固数据库理论。CS 186课程的学生给Spark添加特性,倒是不错的项目,不过我们仅仅建议从零实现一个简单的关系型数据库管理系统。自然,它将不会有太多的特性,但是即便只实现典型的关系型数据库管理系统每个方面最基础的功能,也是相当有启发的。

    最后,数据模型往往是数据库中一个被忽视的、教学不充分的方面。关于这个主题,我们推荐的书籍是 Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World

    Readings in Database Systems 数据库管理系统:原理与设计

    编程语言与编译器

    多数程序员学习编程语言的知识,而多数计算机科学家学习编程语言 相关 的知识。这使得计算机科学家比起程序员拥有显著的优势,即便在编程领域!因为他们的知识可以推而广之:相较只学习过特定编程语言的人,他们可以更深入更快速地理解新的编程语言。

    我们推荐的入门书是 Bob Nystrom 所著的优秀的 Crafting Interpreters,可在网上免费获取。这本书条理清晰,富有趣味性,非常适合那些想要更好地理解语言和语言工具的人。我们建议你花时间读完整本书,并尝试任何一个感兴趣的“挑战”。

    另一本更为传统的推荐书籍是 《编译原理》,通常称为“龙书”。不幸的是,这本书不是为自学者而设计的,而是供教师从中挑选一些主题用于1-2学期的教学。

    如果你选择使用龙书进行自学,你需要从中甄选主题,而且最好是在导师的帮助下。我们建议依据某个视频课程来设定学习的结构,然后按需从龙书中获取深入的内容。我们推荐的在线课程是Alex Aiken在MOOC平台 edX 所开设的

    编译原理

    不要做一个只写样板代码的程序员。相反,给用户和其他程序员创造工具。从纺织工业和钢铁工业中学习历史教训:你想制造机器和工具,还是操作这些机器?

    — Ras Bodik 在他的编译器课程伊始

    分布式系统

    随着计算机在数量上的增加,计算机同样开始 分散。尽管商业公司过去愿意购买越来越大的大型机,现在的典型情况是,甚至很小的应用程序都同时在多台机器上运行。思考这样做的利弊权衡,即是分布式系统的研究所在,也是越来越重要的一项技能。

    我们推荐的自学参考书是 Martin Kleppmann 的 《数据密集型应用系统设计》。与传统的教科书相比,它是一本为实践者设计的具有很高的可读性的书,并且保持了深度和严谨性。

    对于那些偏爱传统教材,或者希望可以从网上免费获取的人,我们推荐的教材是Maarten van Steen和Andrew Tanenbaum所著的 《分布式系统原理与范型》(中文第二版英文第三版

    对于喜欢视频课程的人,MIT的6.824 是一门很好的在线视频课程,由 Robert Morris 教授的研究生课程,在这里可以看到课程安排。

    不管选择怎样的教材或者其他辅助资料,学习分布式系统必然要求阅读论文。这里有一个不错的论文清单,而且我们强烈建议你出席你当地的Papers We Love(仅限美国)。

    数据库设计启蒙读物 https://www.zhihu.com/question/268832961

     

    常见问题解答

    这份指引的目标受众是?

    我们面向自学的软件工程师、培训班学生、“早熟的”高中生或者想要通过自学补充正式教育的大学生。关于何时开启这段自学旅程,完全取决于个人,不过多数人在有一定的职业经历后深入学习计算机科学理论会获益匪浅。比如,我们注意到,如果学生在工作中曾经使用过数据库,他们会 喜爱 学习数据库系统课程;如果学生从事过一两个Web项目,他们会 喜爱 学习计算机网络。

    人工智能/计算机图形学/XX主题怎么样?

    我们试图把计算机科学主题清单限制到那些我们认为 每一个软件工程师 都应该了解的内容,不限于专业或行业。拥有了这些基础,你将能更加轻松地挑选教材或论文,然而无需指引地学习核心概念。在这里,我们给出一些其他常见主题的自学起点:

    一定要严格遵守推荐的学习次序吗?

    事实上,所有主题之间都有一定程度的重叠,彼此循环引用。以离散数学和算法的关系为例:先学习数学可以帮助你更深入地分析和理解算法,然而先学习算法可以为学习离散数学提供更大的动力和应用背景。理想情况下,你将在你的职业生涯多次重温二者。

    因此,我们所推荐的次序主要是为了帮助你 起步……如果你出于某种强烈的原因而倾向以不同的顺序学习,那也没有关系,勇敢开始吧!不过在我们看来,最重要的“先决条件”是:先学计算机架构再学操作系统或数据库,先学计算机网络和操作系统再学分布式系统。

    和Open Source Society、freeCodeCamp curricula等比起来,这份指引?

    OSS指引涵盖太多主题,在许多主题中推荐劣质资源,没有就特定课程哪些方面有价值提供原因或指引。我们努力对这份指引中的课程加以限制,仅仅包括那些你作为软件工程师 确实需要了解的,不论你的专业方向,并且对每门课程为何必要做出了解释以帮助你理解。

    FreeCodeCamp主要关注编程,而不是计算机科学。至于你为什么要学习计算机科学,参见上文。如果你是个新手,我们建议先学 freeCodeCamp 的课程,一两年后再回归本指南。

    XX编程语言怎么样?

    学习一门特定的编程语言和学习计算机科学的一个领域完全不在一个维度——相比之下,学习语言 容易 且 缺乏价值。如果你已经了解了一些语言,我们强烈建议遵照我们的指引,然后在学习的空当中习得语言,或者暂且不管以后再说。如果你已经把编程学得不错了(比如学完了 《计算机程序的构造和解释》),尤其是如果你学习过编译器,那么面对一门新的语言,你只需要花一个周末稍多的时间即可基本掌握,之后你可以在工作中学习相关的类库/工具/生态。

    XX流行技术怎么样?

    没有任何一种技术的重要程度可以达到学习其使用足以成为计算机科学教学的核心部分。不过,你对学习那门技术充满热情,这很不错。诀窍是先从特定的技术回退到基本的领域或概念,判断这门流行技术在技术的宏观大局中位于何处,然后才深入学习这门技术。

    为什么你们还在推荐SICP?

    先尝试读一下,有些人觉得 SICP 让人神魂颠倒,这在其他书很少见。如果你不喜欢,你可以尝试其他的东西,也许以后再回到 SICP。

    为什么你们还在推荐龙书?

    龙书依旧是内容最为完整的编译器单本书籍。由于过分强调一些如今不够时新的主题的细节,比如解析,这本书招致了恶评。然而事实上,这本书从未打算供人一页一页的学习,而仅仅是为了给教师准备一门课程提供足够的材料。类似地,自学者可以从书中量身按需挑选主题,或者最好依照公开课授课教师在课程大纲中的建议。

    如何便宜获取教材?

    我们所建议的许多教材在网上都可以免费获得,这多亏了作者们的慷慨。对于那些不免费的书籍,我们建议购买旧版本的二手书籍。广而言之,如果一本教材有多个版本,旧版本大概率是完全足够使用的。即便新版本的价格是旧版本的10倍,新版本也绝不可能比旧版本好10倍!

    中文翻译新增: 事实上,比起美国,在国内购买技术书籍可以说是相当“廉价”了。如果仍旧寻求更加便宜的购买渠道,可以参考这篇V2EX上的讨论帖子,其中提到了一些不错的购买渠道。

    这份指引是谁写的?

    这份指引由Bradfield School of Computer Science(旧金山)的两位教员:Ozan OnayMyles Byrne编写,并由 Oz 于 2020 年更新。这份指引基于我们对数千名自学成才的工程师和培训班学生教授计算机科学基础的经验。感谢我们所有学生对自学资源的持续反馈。

    只要有足够的时间和动力,我们非常有信心,你可以自学完以上所有课程。如果你喜欢一个集中式、结构化、由教师指导的课程,你可能对我们的计算机科学强化班感兴趣。我们不建议你去攻读硕士学位。

    这份指引是谁翻译的?

    这份指引的中文翻译是社区共同贡献的成果,我们欢迎任何反馈和改进!

    展开全文
    qq_42672770 2020-06-13 11:53:30
  • 165KB weixin_38711740 2021-05-22 23:45:56
  • 常见数据库知识总结 MYAQL:事务:事务是并发控制的基本单元,事务是一个操作序列,要么都执行,要么都不执行,他是一个不可分割的工作单位,事务是维护数据库一致性的单位。 四个ACID基本性质: 1.原子性:要么...

    常见数据库知识总结

    MYAQL:
    事务:事务是并发控制的基本单元,事务是一个操作序列,要么都执行,要么都不执行,他是一个不可分割的工作单位,事务是维护数据库一致性的单位。

    四个ACID基本性质:

    1.原子性:要么都执行,要么都不执行。
    2.一致性:合法的数据才可以被写入。
    3.隔离性:允许多个用户并发访问。
    4.持久性:事务结束后,事务处理的结果必须得到固化。即一旦提交,对数据库改变是永久的。

    事物的语句:

    1.开始事务:BEGIN TRANSACTION
    2.提交事务:COMMIT TRANSACTION
    3.回滚事务:ROLLBACK TRANSACTION

    慢查询:

    1,开启慢查询,可以让mysql记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好地优化数据库系统的性能。
    slow_query_log 慢查询开启状态
    slow_query_log_file 慢查询日志的存放位置
    long_query_time查询超过多少秒才记录

    2,可以通过设置全局变量的方法设定:
    例如:set gloable slow_query_long on   开启慢查询状态
    service mysqld restart 即可

    3,查询对应值:
    show variables like'slow_query%';
    show variables like 'long_query_time';

    4,测试慢查询是否正确开启:
    select sleep(2);   执行慢查询语句,查看是否有对应的慢查询日志生成。

    常见的sql语句:(sql语句中大小写均可执行,规范是大写)

    1,说明:创建数据库 
    create database westos;
    2,说明:删除数据库 
    drop database westos;
    3,说明:查询user表中的Host,User,Password信息
    select host,user,password from user;
    4,说明:查询user表的数据结构
    desc user;
    5,说明:新建数据库westos中的表格
    use westos;
    create table linux(
    username varchar(50) not null,
    password varchar(50) noe null
    );
    6,说明:在linux表格中插入信息
    insert into linux values('xyy','123');
    7,说明:修改linux表格中的信息
    update linux set password '456' where username='xyy';
    8,说明:在linux表格中添加age字段
    alter table linux add age varchar(4) after username;
    9,说明:在linux表格中移除age字段
    alter table linux drop age;
    10,说明:修改表格名字
    alter table linux rename haha;
    11,说明:删除表格中的某一行
    delete from haha where username='xyy';
    12,说明:删除表格
    drop table haha;

    数据库的锁机制:

        数据库的大并发要考虑锁和锁的性能问题,加锁是为了实现并发控制。数据库是一个多用户资源,
        若对并发控制不加控制会读取和存储不正确的数据,破坏数据的一致性(脏读,不可重复读,幻读等)可能会产生死锁。
        锁机制保证在一个事务释放锁之前其他事务不可以进行修改。
        锁:行级锁,表级锁,悲观锁,乐观锁
        悲观锁:事务每次操作之前假设有其他事务会修改需访问的数据,会要求上锁。
        乐观锁:事务每次操作之前假设没有其他事务会修改需访问的数据,不会要求上锁。
        
        共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源
        共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的
        事务只能读数据,不能修改数据。
        排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务
        既能读数据,又能修改数据。
        共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享。

    mysql两种引擎的区别:

    Innodb引擎:提供了对数据库ACID事务的支持,并且实现了sql标准的四种隔离级别,事务安全的,支持行级锁,不支持全文索引。
    MyIASM引擎:mysql的默认引擎,没有提供对数据库事务的支持,非事务安全的,锁的粒度是表级的,支持全文索引类型,相对简单性能优。
    总结:
    MYIASM管理非事务表,提供高速存储和检索,以及全文搜索能力,如果在应用中执行大量的select操作,应选择MYIASM引擎
    Innodb用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量的insert和update操作,应选择innodb引擎。

    四种隔离级别:

    1,未提交读:读数据时不会检查使用任何锁。
    2,已提交读:只读取提交的数据并等待其他事务释放锁。
    3,可重复读:会保持共享锁到事务结束。
    4,可序列化:不仅会锁定影响的数据,还会锁定这个范围

    mysql的四种日志

    1.错误日志:Error Log.记录mysql运行过程ERROR,WARING等信息,系统出错或某条记录出问题可查看ERROR日志。
    2.日常运行日志:General query log记录mysql中每条请求数据。
    3.二进制日志:Binary log,包含一些事件,数据库的改动等。
    4.慢查询日志:slow query log,用于mysql的性能调优。

    mysql优化:

    1.定期分析检查表:
    analyze table tbl_name;
    check table tbl_name;
    2.定期优化表:
    optimize table tbl_name;

    SQL语句:group by

    通过一定的规则将一个数据集划分成若干个小区域,然后针对若干个小区域进行数据处理。
    例:分别计算男女性用户平均年龄:
    select 性别,avg(年龄) as average from 表名 group by 性别

    关系型数据库的三大范式:

    第一范式:只要是关系型数据库的表,都满足第一范式。
    性质:第一范式的数据表中的所有字段都是单一属性,不可分割。
    第二范式:不可使用组合键,确保唯一主键。
    第三范式:要求数据表中不存在非关键字段对任一候选关键字段的传递函数依赖,表分开。

    mysql主从复制:

    mysql主从复制的原理就是把主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器上的数据就和
    主服务器上的数据一致。编辑/etc/my.cnf文件确保server_id不同即可。
    GTID强化了数据库的主备一致性,故障恢复,容错能力。
    主库数据丢失---->使用半同步复制
    mysql主从复制开启了IO线程和SQL线程。

    mysql同步复制,异步复制,半同步复制的原理

    在mysql5.5版本之前,复制都是异步复制。 该复制经常遇到的问题是:因为binlog日志是推送的,所有主库和从库
    之间存在一定的延迟。 这样就会造成很多问题,比如主库因为磁盘损坏等故障突然崩掉,导致binlog日志不存在,
    同时因为延迟binlog还没有推送到从库,从库也就会丢失很多被主库提交的事物,从而造成主从不一致。
    解决如上的问题,mysql5.5版本之后引入了半同步复制机制。
    异步复制:主库写入一个事务commit提交并执行完之后,,将日志记录到binlog,将结果反馈给客户端,
    最后将日志传输到从库。

    半同步复制:主库写入一个事务commit提交并执行完之后,并不直接将请求反馈给前端应用用户,而是等待从库也接收
    到binlog日志并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保障了事物执行后,至少有两份
    日志记录,一份在主库的binlog上 ,另一份至少在从库的中继日志Relay log上,这样就极大的保证了数据的一致性。

    同步复制:指的是客户端连接到MySQL主服务器写入一段数据,MySQL主服务器同步给MySQL从服务器需要等待从服务器
    发出同步完成的响应才返回客户端OK, 这其中等待同步的过程是阻塞的, 如果有N台从服务器, 效率极低。 
    异步复制: 指的是客户端连接到MySQL主服务器写入一段数据,MySQL主服务器将写入的数据发送给MySQL从服务器, 然后
    直接返回客户端OK, 可能从服务器的数据会和主服务不一致。
    半同步复制:指的是客户端连接到MySQL主服务器写入一段数据, MySQL主服务器只将数据同步复制给其中一台从服务器, 
    半同步复制给其他的从服务器, 来达到其中一台从服务器完全同步的效果。

    MHA主从原理,选举机制:

    MHA目的在于维持master库的高可用性,最大特点是可以修复多个slave之间的差异日志,最终使所有的slave
    保持一致,然后从中选择一个新的充当新的master,并使其他的slave指向它。

    热备份和冷备份的区别:

    1.冷备份是发生在数据库正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份时将要害性文件拷贝
    到另一个位置的一种说法。
    2.热备份是在数据库运行的情况下,采用archivelog mode方式来备份数据库的方法。
    --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- 

     

    1、触发器的作用?

    触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

    2、什么是存储过程?用什么来调用?

    存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 调用: 1)可以用一个命令对象来调用存储过程。 2)可以供外部程序调用,比如:java程序。

    3、存储过程的优缺点?

    优点: 1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。 缺点:移植性差

    4、存储过程与函数的区别

    存储过程函数
    用于在数据库中完成特定的操作或者任务(如插入、删除等)用于特定的数据(如选择)
    程序头部声明用procedure程序头部声明用function
    程序头部声明时不需描述返回类型程序头部声明时要描述返回类型,而且PL/SQL块中至少要包括一个有效的return语句
    可以使用in/out/in out 三种模式的参数可以使用in/out/in out 三种模式的参数
    可作为一个独立的PL/SQL语句来执行不能独立执行,必须作为表达式的一部分调用
    可以通过out/in out 返回零个或多个值通过return语句返回一个值,且改值要与声明部分一致,也可以是通过out类型的参数带出的变量
    SQL语句(DML 或SELECT)中不可调用存储过程SQL语句(DML 或SELECT)中可以调用函数

    5、索引的作用?和它的优点缺点是什么?

    索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

    6、什么样的字段适合建索引

    唯一、不为空、经常被查询的字段

    7、索引类型有哪些?

    逻辑上:
    Single column 单行索引
    Concatenated 多行索引
    Unique 唯一索引
    NonUnique 非唯一索引
    Function-based 函数索引
    Domain 域索引 物理上:
    Partitioned 分区索引
    NonPartitioned 非分区索引
    B-tree :
    Normal 正常型B树
    Rever Key 反转型B树 Bitmap 位图索引

    8、什么是事务?什么是锁?

    事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

    9、什么叫视图?游标是什么?

    视图:是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表。它使得我们获取数据更容易,相比多表查询。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

    10、视图的优缺点

    优点: 1)对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2 )用户通过简单的查询可以从复杂查询中得到结果。 3 )维护数据的独立性,试图可从多个表检索数据。 4 )对于相同的数据可产生不同的视图。 缺点: 性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据

    11、列举几种表连接方式,有什么区别?

    内连接、自连接、外连接(左、右、全)、交叉连接 内连接:只有两个元素表相匹配的才能在结果集中显示。 外连接: 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 全外连接:连接的表中不匹配的数据全部会显示出来。 交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。

    12、主键和外键的区别?

    主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

    13、在数据库中查询语句速度很慢,如何优化?

    1.建索引 2.减少表之间的关联 3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面 4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 5.尽量用PreparedStatement来查询,不要用Statement

    14、数据库三范式是什么?

    第一范式:列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束 且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上

    15、union和union all有什么不同?

    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。 UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

    16、Varchar2和varchar有什么区别?

    Char的长度是固定的,而varchar2的长度是可以变化的,比如,存储字符串“abc”对于char(20),表示你存储的字符将占20个字节,包含17个空,而同样的varchar2(20)只占了3个字节,20只是最大值,当你存储的字符小于20时,按实际长度存储。 char的效率要被varchar2的效率高。 目前varchar是varchar2的同义词,工业标准的varchar类型可以存储空字符串,但是oracle不能这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型varchar2,这个类型不是一个标准的varchar,他将在数据库中varchar列可以存储空字符串的特性改为存储null值,如果你想有向后兼容的能力,oracle建议使用varchar2而不是varchar

    17、Oracle和Mysql的区别?

    1)库函数不同。 2)Oracle是用表空间来管理的,Mysql不是。 3)显示当前所有的表、用户、改变连接用户、显示当前连接用户、执行外部脚本的语句的不同。 4)分页查询时候时候,mysql用limit oracle用rownum

    1. mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。 5)sql的语法的不同。
       

      18、Oracle语句有多少类型

      Oracle语句分三类:DDL、DML、DCL。 DDL(Data Definition Language)数据定义语言,包括: Create语句:可以创建数据库和数据库的一些对象。 Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。 Alter语句:修改数据表定义及属性。 Truncate语句:删除表中的所有记录,包括所有空间分配的记录被删除。 DML(Data Manipulation Language)数据操控语言,包括: Insert语句:向数据表张插入一条记录。 Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录。 Update语句:用于修改已存在表中的记录的内容。 DCL(Data Control Language)数据库控制语言,包括: Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。 Revoke语句:可以废除某用户或某组或所有用户访问权限

      19、oracle分页查询语句

      使用rownum,两种如下: 第一种: select * from (select t.*,rownum row_num from mytable t) b where b.row_num between 1 and 10 第二种: select * from ( select a.*, rownum rn from mytable a where rownum <= 10 ) where rn >= 1 使用rowid, 如下: select * from scott.emp where rowid in (select rd from (select rowid as rd ,rownum as rn from scott.emp ) where rn<=6 and rn>3)

      20、从数据库中随机取50条

      select * from (select * from t_example order by dbms_random.random) where rownum <= 50

      21、order by与group by的区别

      order by 排序查询、asc升序、desc降序 group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。

      22、commit在哪里会运用

      oracle的commit就是DML语句提交数据(这里是释放锁不是锁表),在未提交前你前面的操作更新的都是内存,没有更新到物理文件中。 执行commit从用户角度讲就是更新到物理文件了,事实上commit时还没有写date file,而是记录了redo log file,要从内存写到data物理文件,需要触发检查点,由DBWR这个后台进程来写,这里内容有点多的,如果不深究的话你就理解成commit即为从内存更新到物理文件。

      23、行转列、列换行怎么转

      1)使用decode函数 2)使用case when语句

      24、什么是PL/SQL?

      PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL 只有 Oracle 数据库有。 MySQL 目前不支持 PL/SQL 的。

      25、序列的作用

      Oracle使用序列来生成唯一编号,用来处理一个表中自增字段。 Oracle序列是原子对象,并且是一致的。也就是说,一旦您访问一个序列号,Oracle将在处理下一个请求之前自动递增下一个编号,从而确保不会出现重复值。

      26、表和视图的关系

      视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。 表就是关系数据库中实际存储数据用的。

      27、oracle基本数据类型

      1)字符串类型 char、nchar、varchar、varchar2、nvarchar2 2)数字类型 number、integer 3)浮点类型 binary_float、binary_double、float 4)日期类型 date、 timestamp 5)LOB类型 blob、clob、nclob、bfile

      28、truncate与 delete区别

      TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
      TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 TRUNCATE,DELETE,DROP 放在一起比较:
      TRUNCATE TABLE :删除内容、释放空间但不删除定义。
      DELETE TABLE: 删除内容不删除定义,不释放空间。
      DROP TABLE :删除内容和定义,释放空间。

      29、oracle获取系统时间

      select to_char(sysdate, &#39;yyyy-MM-dd HH24:mi:ss&#39;) from dual;

      30、oracle怎么去除去重

      使用distinct关键字

    --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- --------------------- 

    1. SQL语言包括哪些类型?

    数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index

    数据操纵:Select ,insert,update,delete

    数据控制:grant,revoke

    GRANT】是授权语句, 将对某个表的操作权限授予某个用户
    举例:
    将对学生表Student的插入权限授予用户U1:
    GRANT insert
    on table Student
    to U1;

    REVOKE】就是收回权限,值得注意的是收回权限的时候注意是不是级联的收回
    举例:
    将U1对Student的插入权限收回
    REVOKE insert
    on table Student
    from U1;
    其中,GRANT语句和REVOKE语句是相对的

    2. 内联接,外联接区别?

    内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。

    在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种。

    等连接(内连接)、非等连接、自连接、外连接(左、右、全) Or hash join/merge join/nest loop(cluster join)/index join

    数据库中的内连接、自然连接、外连接

    数据中的连接join分为内连接、自然连接、外连接,外连接又分为左外连接、右外连接、全外连接。
      
      当然,这些分类都是在连接的基础上,是从两个表中记录的笛卡尔积中选取满足连接的记录。笛卡尔积简单的说就是一个表里的记录要分别和另外一个表的记录匹配为一条记录,即如果表1有2条记录,表2也有2条记录,经过笛卡尔运算之后就应该有2*2即4条记录。如下表:


    自然连接(natural join)
      自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。
      sql语句:Select …… from 表1 natural join 表2
      结果:

       内连接(inner  join)
      内连接基本与自然连接相同,不同之处在于自然连接奥球是同名属性列的比较,而内连接则不要求两属性列同名,可以用using或on来指定某两列字段相同的连接条件。
      sql语句:Select …… from 表1 inner join 表 2 on 表1.A=表2.E
      结果:
     
      自然连接时某些属性值不同则会导致这些元组会被舍弃,那如何保存这些会被丢失的信息呢,外连接就解决了相应的问题。外连接分为左外连接、右外连接、全外连接。外连接必须用using或on指定连接条件。

     左外连接(left outer join)
      左外连接是在两表进行自然连接,只把左表要舍弃的保留在结果集中,右表对应的列上填null。
      sql语句:Select …… from 表1 left outer join 表2 on 表1.C=表2.C
    结果:

      右外连接(rignt outer join)
      右外连接是在两表进行自然连接,只把右表要舍弃的保留在结果集中,左表对应的列上填null。
     Select …… from 表1 rignt outer join 表2 on 表1.C=表2.C
      结果:

      全外连接(full join)
      全外连接是在两表进行自然连接,只把左表和右表要舍弃的都保留在结果集中,相对应的列上填null。
     Select …… from 表1 full join 表2 on 表1.C=表2.C
      结果:

    1)内连接:只连接匹配的行 select A.c1,B.c2 from A join B on A.c3 = B.c3;

    2)左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行)以及右边表中全部匹配的行 select A.c1,B.c2 from A left join B on A.c3 = B.c3;

    3)右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行)以及左边表中全部匹配的行 select A.c1,B.c2 from A right join B on A.c3 = B.c3;

    4)全外连接:包含左、右两个表的全部行,不管在另一边的表中是否存在与它们匹配的行 select A.c1,B.c2 from A full join B on A.c3 = B.c3;

    5)(theta)连接:使用等值以外的条件来匹配左、右两个表中的行 select A.c1,B.c2 from A join B on A.c3 != B.c3;

    6)交叉连接:生成笛卡尔积——它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行一一匹配 select A.c1,B.c2 from A,B;

    3. 什么是存储过程?用什么来调用?

    存储过程是一个预编译的SQL语句, 简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程(CALL)。

    4.触发器的作用?

    触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

    5. 索引的作用?和它的优点缺点是什么?

    索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

    6. 什么是内存泄漏?

    一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。

    7. 如何维护数据库的完整性和一致性?

    尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

    8. 什么是事务?什么是锁?

    事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

    锁:在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。共享锁(只读不写)、排他锁(可读可写)

    9. 事务的隔离级别有哪些?

    事务隔离级别包括: 原子性,即不可分割性,事务要么全部被执行,要么就全部不被执行; 一致性或可串性,事务的执行使得数据库从一种正确状态转换成另一种正确状态; 隔离性,在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务; 持久性,事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

    10. 什么叫视图?游标是什么?

    视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

    游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。

    11. 什么是主键?什么是外键?

    主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。

    主键在本表中是唯一的、不可为空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

    12. 对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?

    对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。

    13、可以用什么来确保表格里的字段只接受特定范围里的值?

    Check限制,它在数据库表格里被定义,用来限制输入该列的值。 触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。

    14. 什么是相关子查询?如何使用这些查询?

    经验更加丰富的开发人员将能够准确地描述这种类型的查询。 相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。

    15. 使用索引查询一定能提高查询的性能吗?为什么?

    通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用; 基于非唯一性索引的检索 索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是用错了索引,或者讲是场合不同

    16. 查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不连续增长的列, 查询语句?

    select top 10 * from A where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID

    1

    select top 10 * from where (id  not in(select top 30(id) from  as order by id)) order by id

    1

    2

    3

    4

    5

    SELECT TOP 10 * FROM (

    SELECT TOP 40 * FROM tableName

    ORDER BY ID DESC

    ) T

    ORDER BY ID

    17. 分页查询语句?

    (1)mysql的分页查询

    ?

    1

    select o.* from (sql) o limit firstIndex,pageSize

    (2)sqlserver2005的分页查询

    ?

    1

    select top pageSize o.* from (select row_number() over(order by orderColumn) as rownumber,* from(sql) as where rownumber>firstIndex;

    (3)oracle分页查询

    ?

    1

    select from(select a.*,ROWNUM rn from(sql) a where ROWNUM<=(firstIndex+pageSize)) where rn>firstIndex

    18. 如何优化数据库,如何提高数据库的性能?

    1)给数据库做索引,合理的索引能立即显著地提高数据库整个系统的性能。

    2)在适当的情况下,尽可能的用存储过程而不是SQL查询。因为前者已经过了预编译,运行速度更快。

    3)优化查询语句,通过高性能的查询语句提高数据库的性能。

    19、说出一些数据库优化方面的经验?

    用PreparedStatement 一般来说比Statement性能高。

    有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

    根据扫描的原理,第一条子查询语句要比第二条关联查询的效率高:

    1)select e.name,e.salary where e.managerid=(select id from employee where name='zxx');

    2)select e.name,e.salary,m.name,m.salary from employees e,employees m where e.managerid = m.id and m.name='zxx';

    表中允许适当冗余。如,主题帖的回复数量和最后回复时间等

    将姓名和密码单独从用户表中独立出来。这可以是非常好的一对一的案例。

    sql语句全部大写,特别是列名和表名都大写。特别是sql命令的缓存功能,更加需要统一大小写,sql语句?发给oracle服务器?语法检查和编译成为内部指令?缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment

    还有索引对查询性能的改进也是值得关注的。

    20. 表与表之间的关联关系

    分为3种:一对一、一对多、多对多。

    21. 事前触发和事后触发有何区别?语句级触发和行级触发有何区别?

    事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

    22. 数据库设计的必要性及设计步骤

    好的数据库结构有利于:节省数据的存储空间,能够保证数据的完整性,方便进行数据库应用系统的开发

    设计不好的数据库结构将导致:数据冗余、存储空间浪费和内存空间浪费

    不管数据库的大小和复杂程度如何,可以用下列基本步骤来设计数据库:收集信息--标识对象--设计数据模型--标识每个对象--存储的信息类型–标识对象之间的关系

    23. 什么是数据模型?什么是规范化?

    数据模型是一种标识实体类型及其实体间联系的模型。典型的数据模型有网状模型、层次模型和关系模型。

    从关系数据库的表中,除去冗余数据的过程称为规范化。包括:精简数据库的结构,从表中删除冗余的列,标识所有依赖于其它数据的数据

    24. 谈谈数据库设计的三范式

    第一范式的定义:如果一个表中没有重复组(即行与列的交叉点上只有一个值,而不是一组值),则这个表属于第一范式(常记成1NF)。简而言之:"每一字段只存储一个值"。例如:职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码)

    第二范式的定义:如果一个表属于1NF,任何属性只依赖于关键字,则这个表属于第二范式(常记成2NF )。简而言之:必须先符合1NF的条件,且每一行都能被唯一的识别。将1NF转换成2NF的方法是添加主键。例如:学号,姓名,课程名,成绩

    第三范式的定义:如果一个表属于2NF,且不包含传递依赖性,则这个表是第三范式(常记成 3NF)。满足3NF的表中不包含传递依赖。简而言之:没有一个非关键属性依赖于另一个非关键属性。例如:表一:学号,课程号,成绩。 表二:学号,姓名,所在系,系名称,系地址。表三:课程号,课程名,学分

    25. union和union all有什么不同?

    Union和Union All的区别之一在于对重复结果的处理。 UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL

    26. 设计数据库应注意那些问题?

    (1)原始单据与实体之间的关系

    可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

    〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

    (2)主键与外键

    一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与

    外键的配对,表示实体之间的连接。

    (3)基本表的性质

    基本表与中间表、临时表不同,因为它具有如下四个特性:

    1)原子性。基本表中的字段是不可再分解的。

    2)原始性。基本表中的记录是原始数据(基础数据)的记录。

    3)演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。

    4)稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

    理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

    (4)范式标准

    基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

    〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

    在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

    表1 商品表的表结构

    商品名称 商品型号 单价 数量 金额

    电视机 29吋 2,500 40 100,000

    (5)通俗地理解三个范式

    通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

    第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

    第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

    第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运

    行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式

    ,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

    (6)要善于识别与正确处理多对多的关系

    若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

    〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

    (7)主键PK的取值方法

    PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

    (8)正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

    〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

    (9)E--R图没有标准答案

    信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

    (10) 视图技术在数据库设计中很有用

    与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

    对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

    (11)中间表、报表和临时表

    中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

    (12) 完整性约束表现在三个方面

    域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。

    参照完整性:用PK、FK、表级触发器来实现。

    用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

    (13) 防止数据库设计打补丁的方法是“三少原则”

    1) 一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了

    重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

    2)一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的

    外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

    3) 一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一

    个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。

    数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性)

    的E--R图,要好得多。

    提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的

    个数、主键的个数、属性的个数就会越少。

    提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。

    “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

    (14) 提高数据库运行效率的办法

    在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

    1)在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

    2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。

    3)发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

    4)对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

    5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

    总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

    展开全文
    lyfqyr 2018-10-24 21:55:36
  • xuyuhua1985 2013-01-27 21:07:34
  • 41KB weixin_38697123 2021-05-12 02:37:41
  • hificamera 2015-09-08 13:16:46
  • 648KB weixin_38748239 2021-05-25 23:53:52
  • 215KB weixin_38667920 2021-06-01 08:23:58
  • 3.01MB weixin_38686399 2021-05-16 01:02:44
  • 1.23MB weixin_38711333 2021-05-22 17:36:00
  • weixin_31830389 2021-06-29 11:25:38
  • 318KB weixin_38645266 2021-05-13 05:26:10
  • 1.9MB weixin_38630463 2021-05-23 02:14:13
  • jpld 2020-03-19 13:35:10
  • wei2white 2019-04-24 15:14:10
  • weixin_42137700 2018-08-23 16:40:00
  • Peter_Changyb 2019-10-23 11:09:11
  • weixin_33438741 2021-06-25 08:31:43
  • broadview2006 2020-05-28 10:46:44
  • weixin_42691585 2020-08-12 23:37:33
  • NIeson2012 2020-08-11 15:31:59
  • fendouaini 2019-11-09 15:13:53

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,370
精华内容 13,348
关键字:

常见的自然科学现象