精华内容
下载资源
问答
  • 在读《计算机组成与设计:软硬件接口》这本书的5.5 Dependable Memory Hierarchy的时候,虽然知道SEC/DED的用法,但是对下面这一段话不是很理解,最小汉明码距离位4为什么就可以correct single bit e

    最小汉明码距和数据编码的纠错能力的关系

    在读《计算机组成与设计:软硬件接口》这本书的5.5 Dependable Memory Hierarchy的时候,虽然知道SEC/DED的用法,但是对下面这一段话不是很理解,最小汉明码距离位4为什么就可以correct single bit error and detect double bit errors,想了很久,然后看到一些博客的解释,才理解。
    在这里插入图片描述

    minimum Hamming distance = 1

    如果一组编码的码长为n,那么这组编码共可以表示2^n种符号,但这样一来这个编码就没有任何抗干扰能力,因为合法码字之间的最小汉明码距为1,任何一个符号的编码的任意一位发生错误,就变成了另外一个合法的符号编码。因此接收端也无法判断是否有错误发生。

    minimum Hamming distance = 2

    如果编码的最小汉明距离为2,那么任何合法码字发生一位错误都会变成非法码字,但不能确定是由哪一个合法码字错误而来,因此这个编码可以发现一位错误;
    最简单的**奇偶校验码( parity code)**就是汉明距离等于2的一种编码,可以这样考虑:除去parity bit剩下的数据位的最小汉明距离为1,如果两个数只有一位不一样,那parity bit肯定不一样,所以整个数据的汉明距离就是2,如果数据位的汉明距离就≥2,整个数据的距离就一定≥2。

    minimum Hamming distance = 3

    如果编码的最小汉明距离为3,那么任何合法码字发生一位错误都会变成非法码字,而且距离原来的码字距离为1,而距离其他任何合法码字的最小距离为2(这样就可以很明显区分是由哪一个合法编码发生错误转化而来),
    最小汉明距离为3的编码如果发生了两位错误,也可以发现,但是不能够区分到底是一位还是两位,因为存在一个合法的编码与这个错了两位的数据的汉明距离为1,所以接收端并不能分辨到底是什么情况,只能都当成一位的错误去修正。但是如果试图纠正这个错误就会产生新的错误
    Hamming Error Correction Code (ECC) 就是一种最小距离为3的编码:

    Of course, a parity code cannot correct errors, which Hamming wanted to do
    as well as detect them. If we used a code that had a minimum distance of 3, then
    any single bit error would be closer to the correct pattern than to any other valid
    pattern. He came up with an easy to understand mapping of data into a distance 3
    code that we call Hamming Error Correction Code (ECC) in his honor.
    We use extra parity bits to allow the position identification of a single error. Here are the steps to
    calculate Hamming ECC

    1. Start numbering bits from 1 on the left, contrary to the traditional
      numbering of the rightmost bit being 0.
    2. Mark all bit positions that are powers of 2 as parity bits (positions 1, 2, 4, 8,
      16, …).
    3. All other bit positions are used for data bits (positions 3, 5, 6, 7, 9, 10, 11, 12,
      13, 14, 15, …).
    4. The position of parity bit determines sequence of data bits that it checks
      (Figure 5.24 shows this coverage graphically) is:
      ■ Bit 1 (0001two) checks bits (1,3,5,7,9,11,…), which are bits where rightmost
      bit of address is 1 (0001two, 0011two, 0101two, 0111two, 1001two, 1011two,…).
      ■ Bit 2 (0010two) checks bits (2,3,6,7,10,11,14,15,…), which are the bits
      where the second bit to the right in the address is 1.
      ■ Bit 4 (0100two) checks bits (4–7, 12–15, 20–23,…), which are the bits
      where the third bit to the right in the address is 1.
      ■ Bit 8 (1000two) checks bits (8–15, 24–31, 40–47,…), which are the bits
      where the fourth bit to the right in the address is 1.
      Note that each data bit is covered by two or more parity bits.
    5. Set parity bits to create even parity for each group.

    minimum Hamming distance = 4

    如果最小距离为4,发生一位和两位就是可以区分的,因为错了两位的数据和任意一个合法的数据的最小汉明距离都是2,而错了一位的数据离最近的合法数据的距离是1,所以它们是可区分的,但是两位错误还是不能修正。
    比如汉明提出的SEC/DED:
    在这里插入图片描述
    在这里插入图片描述
    在原来的基础上加上一个奇偶校验位,就把最小汉明距离又增加了1,使得它可以correct single bit error and detect double bit errors

    总结

    我们可以在2^n个可用的码字中间选择一些码字来对信源符号进行编码,把这些码字称为合法码字,而其他没有使用的码字称为非法码字。这样合法码字之间的汉明距离就会拉开,有些合法码字发生错误后有可能变成非法码字,接收端收到这些非法码字后就可以判断出传输过程中出现了错误。码字之间的最小汉明距离越大,编码的抗干扰能力就越强。
    可以看出,检验位的长度越长,合法码字所占的比例就越小,如果这些码字能够尽可能地在所有的码字中均匀分布的话,合法码字之间的最小汉明码距就越大,编码的抗干扰能力也就越强,因此设计编码方法的最重要的任务就是使合法码字尽可能地均匀分布。

    展开全文
  • 为什么保持代码整洁如此重要

    万次阅读 多人点赞 2021-02-05 10:47:21
    对于代码整洁,没有唯一的或者严格的定义,而且可能无法...几十年来,我们沿用“编程语言”这个术语,并将其视把我们的想法传达给计算机的语言,可以让计算机运行我们的程序。但是我们错了,这仅仅是部分事实。编程语

    对于代码整洁,没有唯一的或者严格的定义,而且可能无法正式地衡量怎样才算代码整洁,因此你不能在代码仓库上运行一个可以告诉你代码是好是坏、可维护性如何的工具。当然,你可以运行检查器、代码校验器、静态分析器等工具。这些工具会给你很大的帮助。它们是必需的,但光有这些还远远不够。代码整洁与否不是机器或脚本能说了算的(到目前为止),而是作为专业人员的我们才能决定的。

    几十年来,我们沿用“编程语言”这个术语,并将其视为把我们的想法传达给计算机的语言,可以让计算机运行我们的程序。但是我们错了,这仅仅是部分事实。编程语言背后的“真正语言”是将我们的想法传达给其他开发人员的语言。

    这才是代码整洁的真正本质所在。它取决于其他开发人员是否能够读取和维护代码。作为专业人士,我们是唯一能够判断这一点的人。想想看,作为开发人员,我们阅读代码的时间比实际编写代码的时间要多得多。每当我们想要更改或添加新功能,首先必须阅读需要修改或扩展的代码的所有上下文内容。编程语言(Python)就是开发人员实现互相沟通的语言。

    为什么保持代码整洁如此重要,原因有很多。大多数原因与可维护性、减少技术债务、有效配合敏捷开发以及管理一个成功的项目的想法有关。

    我们想探讨的第一个想法是关于敏捷开发和持续交付的。如果希望项目能够以稳定和可预测的速度不断成功地交付特性,那么必须有一个良好且可维护的代码库。

    假设你正驾驶着一辆汽车行驶在去往某个目的地的道路上,而且想要在某个时间点之前到达那里。你必须预估自己到达目的地的时间,这样才能告知正在等你的人。如果汽车不出故障,道路十分平坦,那么你的预估不大可能有太大的偏差;相反,如果道路被破坏,你必须下车把石头移开,或者要避开裂缝,抑或每隔几千米就必须停下来检查一下发动机等,那么你不太可能确定什么时候到达(或者你是否能到达)。这个比喻明确易懂,这里的道路可以理解为代码。如果希望以稳定、恒定和可预测的速度向前推进项目,那么代码应该是可维护和可读的。

    技术债务是指因妥协或所做出的不良决策而导致的软件问题。在某种程度上,我们可以从两个方面考虑技术债务问题。一是从过去到现在,如果我们当前面临的问题是由之前编写的错误代码造成的,那会怎样?二是从现在到将来,如果我们决定现在就走捷径,而不是花时间去寻找合适的解决方案,那么未来又会为自己带来什么麻烦?

    “债务”这个词用得恰如其分。这是一笔债务,因为在未来代码将比现在更难以修改。产生的成本就是债务的利息。产生的技术债务意味着,明天修改代码比今天更困难,成本更高,而且后天的成本会更昂贵,等等。

    一旦团队不能按时交付一些东西,并且不得不停下来去修复和重构代码,代码就要付出技术债务的代价。

    技术债务最糟糕的一点是它代表了一个长期和根本的问题。这不是什么值得高度警觉的东西。相反,这是一个悄无声息的问题,这个问题分散在整个项目的各个部分,在某一天,在某一个特定的时间,这个问题会“醒来”,并成为项目推进的阻碍。

    1 代码格式化在代码整洁中的作用

     

    代码整洁是指根据一些标准(例如,PEP-8或由项目规范定义的自定义标准)进行的代码格式化和结构化吗?并非如此。

    代码整洁远远不止编码标准、格式化、美化工具和其他有关代码布局的检查这些内容。代码整洁是关于实现高质量的软件和建立一个健壮、可维护和避免技术债务的系统的。一段代码或整个软件组件可以百分之百符合PEP-8(或任何其他准则)标准,但仍可能无法满足上述要求。

    然而,不注意代码的结构会有一些危险。鉴于此,我们先来分析不良代码结构的问题以及如何解决这些问题,然后介绍如何为Python项目配置和使用工具,以便自动检查和纠正问题。

    综上所述,我们可以说代码整洁与PEP-8或编码风格没有任何关系。代码整洁的意义远不止于此,除了可维护性和软件的质量,它还意味着更有意义的东西。不过,正如你将看到的,要实现高效工作,正确地格式化代码非常重要。

    2 在项目中遵循编码风格准则

    编码准则是项目在质量标准下开发时必须考虑的最低要求。在本节中,我们将探讨其背后的原因。接下来我们开始探讨如何通过工具自动在项目中遵循编码风格准则。

    在试图考虑在代码布局中找到某种好的特性时,我们首先想到的就是一致性。我们希望代码能够具有一致的结构,以便更易阅读和理解。如果代码不正确或者结构不一致,并且团队中的每个人都以自己的方式做事,那么最终得到的将是需要额外努力和集中精力才能正确理解的代码。这样的代码很容易引起误解,并且由此引发的漏洞或微小的错误很可能被忽略。

    上述情况是我们想要避免的。我们想要的是一眼就能读懂和理解的代码。

    如果开发团队的成员都同意采用标准化的方式编写代码,那么所得到的代码看起来会更加熟悉。这样,你就能快速识别模式,并且记住这些模式,进而能更容易地理解内容和检测错误。例如,当某些代码出错时,你可能会在你熟悉的模式中看到一些奇怪的东西——它们会吸引你的注意,再仔细观察,就很可能发现错误!

    正如经典著作Code Complete中所述的,在名为Perception in Chess(1973年)的论文中对此进行了有趣的分析,该论文提到了一项实验,以确定不同的人如何理解或记忆不同的棋局。该实验针对不同级别的棋手(新手、中级棋手和象棋高手)以及棋盘上不同位置的棋局来进行统计。他们发现,当棋子的位置是随机的时候,新手能和象棋高手表现得一样好。因为这只是一个记忆练习,任何人都可以发挥出合理的水平。但当棋子的位置遵循一个可能发生在一场真正对弈中的一些逻辑顺序(或者,遵守某种一致性,坚持某种模式时)时,那么象棋高手们的表现比其他人要好得多了。

    现在我们想象一下,同样的情况也适用于软件开发。作为Python方面的软件工程师专家,我们就好比上述例子中的象棋高手。如果代码的结构是随机的,没有遵循任何逻辑或者没有遵循任何标准,我们就会像一个新手开发人员一样,很难发现错误;如果我们习惯以结构化的方式阅读代码,并且通过遵循这种模式学会从代码中快速获得想法,就会在项目开发中比其他开发人员更有优势。

    就Python而言,你应该遵循的编码风格是PEP-8。你可以对其进行扩展或采用其中的一部分,以适应正在参与的项目的某种特殊性(如行的长度、字符串的注释等)。不过,我们建议,无论你使用最原始版本的PEP-8规范还是对它进行扩展,都应该坚持使用,而不是从头开始尝试另一个不同的标准。

    这是因为PEP-8充分考虑了Python语法的许多特殊性(通常不适用于其他语言),并且它是由对Python语法做出贡献的核心Python开发人员创建的。因此,我们认为其他标准其实很难与PEP-8相提并论,更不用说超越它了。

    尤其是,在处理代码时,PEP-8还有一些不错的改进特性。

    (1)可进行grep。这就是在代码中对内容进行grep的能力,即在某些文件(以及这些文件的某个部分)中搜索所要查找的特定字符串。PEP-8引入的特性之一是区分将值赋值写入变量的方式和传递给函数的关键字参数的方式。

    为了更好地理解这一点,我们用一个示例加以阐释。假设我们正在进行调试,需要找到名为location的参数值的传递位置。我们可以运行以下grep命令,获悉要查找内容所在的文件和行号。

    $ grep -nr "location=" .
    ./core.py:13: location=current_location,

    现在,我们想知道这个变量在哪里被分配这个值,则可以运行以下命令。

    $ grep -nr "location =" .
    ./core.py:10: current_location = get_location()

    PEP-8建立了这样一种约定,即当通过关键字向函数传递参数时,不使用空格,但在分配变量时使用空格。因此,我们可以调整搜索条件(第一次搜索时等号两侧没有空格,第二次搜索时等号两侧都有一个空格),从而提高搜索效率。这是遵守约定的好处之一。

    (2)一致性。如果代码看起来有一种统一的格式,阅读起来就会容易得多。这对于新加入项目的人来说尤为重要,如果你希望有新的开发人员加入项目,或者为团队聘用新的(可能经验不足的)程序员,那么他们势必要熟悉代码(甚至可能由多个代码仓库组成)。如果代码格式、文档、命名约定等在所有代码仓库的所有文件中都是相同的,那么他们的工作将变得更加轻松。

    (3)代码质量。以结构化的方式查看代码,你一下子就能更熟练地理解它(就像在Perception in Chess中所说的那样),并且更容易发现程序的漏洞和错误。除此之外,检查代码质量的工具也会提示潜在的错误。对代码的静态分析可能有助于降低每行代码的错误率。

    本文摘自《编写整洁的Python代码》

    为什么保持代码整洁如此重要?

     

    这是一本关于Python软件工程原理方面的书。

    关于软件工程的书有很多,关于Python的可用资源也有很多,但要将这两者结合起来,还有许多工作要做。本书正是尝试在这二者之间架起一座桥梁。

    要想在一本书中涵盖关于软件工程的所有主题是不现实的,因为软件工程的领域十分广泛,而且针对某个特定的主题会有专门的图书去介绍。本书重点介绍Python软件工程的主要实践和原则,旨在帮助读者编写更易于维护的代码,同时教读者利用Python的特性来编写代码。

    章节提要

    第1章 简介、代码格式和工具,介绍搭建Python开发环境所需的主要工具、Python开发人员在开始使用该语言时需要了解的基本知识,以及维护项目中代码可读性的一些指导原则,如用于静态分析、文档、类型检查和代码格式化的工具。

    第2章 Python风格代码,介绍Python中的第一个习惯用法——我们在后续章节中将继续使用它。本章还会介绍一些Python的独有特性,以及如何使用它们,并且开始围绕“Python风格代码如何能够让代码质量更高”展开论述。

    第3章 好代码的一般特征,回顾软件工程的一般原则,以期帮助读者编写可维护的代码。本章就这个话题展开讨论,并利用Python语言中的工具应用这些原则。

    第4章 SOLID原则,介绍面向对象软件设计的SOLID原则。SOLID是软件工程领域的行业术语,即SRP、OCP、LSP、ISP和DIP。本章会展示这5项原则在Python中的应用。可以说,鉴于Python语言的性质,并非所有方法都完全适用。

    第5章 用装饰器改进代码,介绍Python的最大特性之一——装饰器。在了解如何创建装饰器(用于函数和类)之后,我们将其用于代码重用、责任分离和创建更细粒度的函数。

    第6章 用描述符从对象中获取更多信息,探讨Python中的描述符,它把面向对象设计提升到了一个新的层次。尽管这更多只是一个与框架和工具相关的特性,但我们可以看到如何用描述符提高代码的可读性,以及如何重用代码。

    第7章 使用生成器,说明生成器可能是Python的最佳特性。事实上,迭代是Python的核心组件,这让我们认为它引申出了一种新的编程范式。一般来说,通过使用生成器和迭代器,我们可以考虑编写程序的方式。基于从生成器中吸取的知识,我们将进一步了解Python中的协同程序以及异步编程的基本知识。

    第8章 单元测试和重构,讨论单元测试在任何所谓“可维护的代码库”中的重要性。本章回顾了单元测试的重要性,并探究了单元测试的主要框架(unittest和pytest)。

    第9章 常见的设计模式,回顾如何在Python中实现最常见的设计模式,不是从解决问题的角度,而是通过研究如何利用更好和更易于维护的解决方案来解决问题。本章提到了Python的一些特性,这些特性使得一些设计模式不可见,并采用实用的方法实现了其中的一些设计模式。

    第10章 整洁架构,强调代码整洁是实现良好架构的基础。我们在第1章中提到的所有细节,以及在此过程中重温的其他内容,在部署系统时都将在整个设计中发挥关键作用。

    展开全文
  • 先看下以下几个概念,概念摘自于百度百科:1、认知:认知,是指人们获得知识或应用知识的过程,或信息...人的认知能力与人的认识过程是密切相关的,可以说认知是人的认识过程的一种产物。2、思维方式是看待事物的角...

    先看下以下几个概念,概念摘自于百度百科:

    1、认知:

    认知,是指人们获得知识或应用知识的过程,或信息加工的过程,人最基本的心理过程。

    包括感觉、知觉、记忆、思维、想像和语言等。

    人脑接受外界输入的信息,经过头脑的加工处理,转换成内在的心理活动,进而支配人的行为,这个过程就是信息加工的过程,也就是认知过程。

    人的认知能力与人的认识过程是密切相关的,可以说认知是人的认识过程的一种产物。

    2、思维方式

    是看待事物的角度、方式和方法,它对人们的言行起决定性作用。思维方式表面上具非物质性和物质性。这种非物质性和物质性的交相影响,构成思维方式演进发展的矛盾运动。

    不同国籍、文化背景的人看待事物的角度、方式不同,便是思维方式的不同。文化诊断学指出:科学思维、价值思维、应变思维决定着思维方式的完善性。

    一方面,思维方式与文化密切相关,是文化心理诸特征的集中体现,另一方面思维方式又与语言密切相关,是语言生成和发展的深层机制,语言又促使思维方式得以形成和发展。语言是思维的主要工具。

    3、观念从通俗意义上来理解,就是人们在长期的生活和生产实践当中形成的对事物的总体的综合的认识。它一方面反应了客观事物的不同属性,同时又加上了主观化的理解色彩。所以,正确地理解,观念是人们对事情主观与客观认识的系统化之集合体。

    我理解,认知形成思维形成思维方式形成观念,认知经过处理形成思维,思维经过判断形成思维方式,思维方式经过文化属性和环境属性处理形成观念。其中思维和思维方式还有个表达环节,受语言能力支配和制约。

    说简单点,认知就是你接收的信息,思维就是你通过接收的信息形成判断的过程,思维方式就是你已经形成了判断,观念就是它已经成为了支配你的固有内在。

    简单说就是,大范围变量到小范围变量到变量再到定量的关系。

    4、有一些研究感觉和思维的书不想推荐了,个人觉得没啥太大用,但有一本书可能会比较有影响, 这本书樊登很推荐,我也非常推荐

    这里面最大的一个区别就是成长性思维的人会觉得自己很可能是常常认知有局限的,所以他会不断地改变和学习认知,所以他的思维方式不断地发生变化,但这个过程里有很重要的不同在于,懂得自我反驳。

    也就是说,成长思维模式的人了解认知是一个不断扩大的过程,而非定式,他们的判断能力也在不断在扩大和改变中。

    我把积极心理学中的把坏事变好事的方法形成了一个固定模式:转念https://zhuanlan.zhihu.com/p/338610720​zhuanlan.zhihu.com

    这件事本身是件看似十分小的事,但是认知影响思维,思维影响当时的情绪,情绪影响语言和行为,行为影响结果,这种可能性是非常大概率真实存在的。

    5、认知到思维的过程:

    以上所有,最后形成一个人的判断力

    判断力,是人对现实做出什么样的态度,和表现出什么样的行为方式的决定因素。判断力是通过选择和抉择的形式将其价值观付诸在事件上的性格体现能力。

    大概了解一下判断力,就说到康德了,平时我们认为判断力是一个定性的东西,然后仔细看看会发现,如果你是一个成长性的思维模式,啥是成长,其实就是不固定认为,而是不断地在变,“永远不变的是变化”,因为认知是在提升的过程中的,所以叫做“成长”。

    作一部分可能的解释,希望有所帮助。

    展开全文
  • 【期末复习】第二章 关系数据库

    千次阅读 多人点赞 2021-11-23 11:28:13
    文章目录2.1 关系数据结构及形式化定义2.1.1 关系2.1.2 关系模式2.1.3 关系数据库2.1.4 关系模型的存储结构2.2 关系操作(了解关系操作具体怎么做)2.2.1 基本的关系操作2.2.2 关系数据语言的分类2.3 关系的完整性 ...

    博主介绍:

    我是了 凡 微信公众号【了凡银河系】期待你的关注。未来大家一起加油啊~


    2.1 关系数据结构及形式化定义

    (了解关系数据结构,包括关系的形式化定义及有关概念都是什么?)

    2.1.1 关系

    关系模型的数据结构表达非常简单,只包含单一的数据结构——关系。

    1. 域(domain)
      定义:域是一组具有相同数据类型的值的集合。
      例如,自然数、整数、实数、长度小于25字节的字符串集合、{0,1}、{男,女}、大于等于0且小于等于100的正整数等,都可以是域。

    2. 笛卡儿积(cartesian product)
      笛卡儿积是域上的一种集合运算。定义:给定一组域D1,D2,…,Dn,允许其中某些域是相同的,D1,D2,…,Dn的笛卡儿积为
      在这里插入图片描述
      其中,每一个元素在这里插入图片描述
      叫做n元组(n-tuple),或简称元组(tuple),元素中的每一个值 di 叫做一个分量(component)。

      简单来讲,就是一张表与另一张表的笛卡儿积等于每一个
      元素都是另一张表相并。(下图为例)
      在这里插入图片描述
      笛卡儿积的基数为:4×4=16 个元组 列为一张二维表

    3. 关系(relation)
      定义:
      在这里插入图片描述

      表示为:R (D1,D2,D3·····Dn)
      R:关系名
      n:关系的目或度(Degree)

      元组:关系中的每个元素是关系中的元组,通常用t表示

      单元关系与二元关系

      • 当n=1时,称该关系为单元关系(Unary relation)或一元关系
      • 当n=2时,称该关系为二元关系(Binary relation)

    2.1.2 关系模式

      数据库中要区分型和值。关系数据中,关系模式是型,关系是值。关系模式是对关系的描述。

      那么一个关系需要描述哪些方面呢?关系是元组的集合,因此关系模式必须指出这个元素集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映像关系。

    定义:关系的描述称为关系模式(relation schema)。它可以形式化地表示为 R(U,D,DOM,F)

    其中,R为关系名,U为组成改关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映像集合,F
    为属性间数据的依赖关系集合。


    2.1.3 关系数据库

      关系数据库也有型和值之分。关系数据库的型也称为关系数据库模式,是对关系数据库的描述。关系数据库模式包括若干域的定义,以及在这些域上定义的若干关系模式。关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库


    2.1.4 关系模型的存储结构

      在关系数据库模型中实体及实体间的联系都用表来描述,但表是关系数据的逻辑模式。在关系数据的物理组织中,有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成;有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。


    2.2 关系操作(了解关系操作具体怎么做)

    2.2.1 基本的关系操作

      关系的查询表达能力很强,是关系操作中最主要的部分。查询操作又可以分为选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(except)、交(intersection)、笛卡儿积等。
      其中选择、投影、并、差、笛卡儿积是5钟基本操作,其他操作可以用基本操作来定义和导出,就像乘法可以用加法来定义和导出一样。
      关系操作的特点是集合操作方式,即操作的对象和结果都是集合。这种操作也称为一次一集合(set-at-a-time)的方式。相反非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式


    2.2.2 关系数据语言的分类

      早期的关系操作能力常用代数方式或逻辑方式来表示,分别称为关系代数和关系演算。关系代数用对关系的运算来表达查询要求,关系演算则用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算
      另外,还有一种介于关系代数和关系演算之间的结构化查询语言。SQL 不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言。它充分体现了关系数据语言的特点和优点,是关系数据库的标准语言。

    因此,关系数据语言可以分为三类:

    在这里插入图片描述


    2.3 关系的完整性 (了解关系的三类完整性约束都有哪些?)

    关系模型中有三类完整性约束:实体完整性、参照完整性和用户的完整性。其中实体完整性和参照完整性是关系模型必须满足完整性约束条件,被称作是关系的两个不变性


    2.3.1 实体完整性

      实体完整性规则:若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值(null value)。所谓空值就是“不知道”或“不存在”或“无意义”的值。

    完整性规则说明如下:

    • 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。例如学生关系对应于学生的集合。
    • 现实世界中的实体是可区分的,即它们具有某种唯一性标识。例如每个学生都是独立的个体,是不一样的。
    • 相应地,关系模型中以主码作为唯一性标识。
    • 主码中的属性即主属性不能取空值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。

    2.3.2 参照完整性

      定义设F是基本关系R的一个或一组属性,但不是关系R的码,Ks是基本关系S的主码。如果F与Ks相对应,则称F是R的外码(foreign key),并称基本关系R为参照关系,基本关系S为被参照关系或目标关系。关系R和S不一定是不同的关系。

    在这里插入图片描述

    显然,目标关系S的主码Ks和参照关系S为被参照关系R的外码必须定义在同一个(或同一组)域上。

    参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中的每个元组在F上的值必须:

    • 或者取空值(F的每个属性值均为空值)
    • 或者等于S中某个元组的主码值。

      例如,对于学生关系中每个元组的“专业号”属性只能取下面两类值:

    • 空值,标识尚未给该学生分配专业;
    • 非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中。即被参照关系“专业”中一定存在一个 元组,它的住吗值等于该参照关系“学生”和“课程号”属性实际上只能取相应被参照关系中已经存在的主码值。

    2.3.3 用户定义的完整性

      任何关系数据库都应该支持实体完整性和参照完整性。这是关系模型所要求的。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

      通俗来讲,就是每个用户都可以对一些属性进行设置约束,比如学生的年纪可以设置只能到1~120岁。


    2.4 关系代数 (了解关系数据库系统的一种语言如何实现关系操作)

      关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。运算的三大要素:运算对象、运算符、运算结果

    关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类


    2.4.1 传统的集合运算

    传统的集合运算是二目运算,包括并、差、交、笛卡儿积4种运算

    设关系R和关系S具有相同的目n(即两个关系都有n个属性),且相应的属性 取自同一个域,t是元组变量,t∈R表示t是R的一个元组。


    • 关系R与关系S的并记作 R∪S={t|t∈R∨t∈S}
      其结果仍为n目关系,由属于R或属于S的元组组成。


    • 关系R与关系S的差记作 R-S={t|t∈R∧t∉S}
      其结果关系仍为n目关系,由属于R而不属于S的所有元组组成。


    • 关系R与关系S的交记作 R∩S={t|t∈R∧t∈S}
      其结果关系仍为n目关系,由既属于R又属于S的元组组成。关系的交可以用差来表示,即R∩S=R-(R-S)。

    • 笛卡儿积
      这里的笛卡儿积严格地讲一ing给是广义的笛卡儿积,因为这里笛卡儿积的元素是元组。


    2.4.2 专门的关系运算

    专门的关系运算包括选择、投影、连接、除运算等。

    1. 选择
      选择又称为限制(restriction)。它是在关系R中选择满
      足给定条件的诸元组,记作:

      其中F表示选择条件,它是一个逻辑表达式,取逻辑
      值“真”或“假”。

      通俗来讲,就是从关系中选出符合我们要求的行:
      例如

      答案

    2. 投影
      关系R上的投影是从R中选择出若干属性列组成新的关
      系。记作:

      其中A为R中的属性列。投影操作是从列的角度进行的运
      算。

      通俗来讲,投影就是选择出我们要显示的结果给显示出来
      例如

      答案

    3. 连接
        连接也称为0连接。它是从两个关系的笛卡儿积中选取
      属性间满足一定条件的元组。记作

      其中,A和B分别为R和S上列数相等且可比的属性组,0
      是比较运算符。连接运算从R和S的笛卡儿积R×S中选取R
      关系在A属性组上的值与S关系在B属性组上的值满足比较
      关系0的元组。

        连接运算中有两种最为重要也最为常用的连接,一种是
      等值连接(equijoin),另一种就是自然连接(natural
      join)。

        0为 “=” 的连接运算称为等值连接。他是从关系R与S的
      广义笛卡儿积中选取A、B属性值相等的那些元组,即等值
      连接为

      自然连接是一种特殊的等值连接。它要求两个关系中进
      行比较的分量必须是同名的属性组,并且在结果中把重复
      的属性列去掉。即若R和S中具有相同的属性组B,U为R和
      S的全体属性性集合,则自然连接可记作:

      例如:关系R和关系S如下所示:
      R表

      S表

      等值连接R.B=S.B结果:

      自然连接R.B=S.B结果:

        可以看到连接操作是从行的角度进行运算。但自然连接还需要取消了重复列,所以是同时从行和列的角度进行运算。

      连接中还有比较特殊的三种

      • 外连接:将舍弃的元组也保存在结果关系中
      • 左外连接:将左边关系要舍弃的元组保留
      • 右外连接:将右边关系要舍弃的元组保留
    4. 除运算
        设关系R除以关系S的结果为关系T,则T包含所有在R但不再S中的属性及其值,且T的元组与S的元组的所有组合都在R中。

      下面用象集来定义除法:
        给定关系 R(X,Y) 和 S(Y,Z),其中X、Y、Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。

      R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影;元组在X上分量值x的相机Yx包含S在Y上投影的集合。记作

      其中Yx为x在R中的象集,x=t的r项[X]。
      例如:


    练习题

    1. 试述关系模型的三个组成部分。
    2. 简述关系数据语言的特定和分类。
    3. 定义并理解下列术语,说明它们之间的联系与区别:
      a. 域,笛卡儿积,关系,元组,属性;
      b. 主码,候选码,外码;
      c. 关系模式,关系,关系数据库。
    4. 举例说明关系模式和关系的区别。
    5. 试述关系模型的完整性规则。在参照完整性中,什么情况下外码属性的值可以为空值?
    6. 试述等值连接与自然连接的区别和联系。
    7. 关系代数的基本运算有哪些?如何用这些基本运算来表示其他运算?

    总结

      关系数据库是重点,因为关系数据系统是目前使用最广泛的数据库系统。

      关系数据库系统与非关系数据库系统的区别是,关系系统只有“表”这一种数据结构;而非关系数据库系统还有其他数据结构,以及对这些数据结构的操作。

      本章讲解了关系数据库的重要概念,包括关系模型的数据结构,关系操作以及关系的三类完整性;了解了用代数方式和逻辑方式来表达的关系语言即关系代数。


    创作不易,点个赞吧!
    如果需要后续再看点个收藏!
    如果对我的文章有兴趣给个关注!
    如果有问题,可以关注公众号【了凡银河系】点击联系我私聊。


    展开全文
  • 文章目录一、关系数据库与非关系型数据库概述1、关系型数据库2、非关系型数据库二、关系数据库与非关系型数据库区别1、数据存储方式不同2、扩展方式不同3、对事务性的支持不同三、非关系型数据库产生背景四、Redis...
  • 属于企业的网站在服务器能力、数据存储容量、应用程序的速度、可靠性和可扩展性方面的要求各不相同。 但网络托管的好处在于,您可以在世界任何其他地方开展业务,同时将其托管在其他地方。技术使企业主更容易处理...
  • 为什么IDEA不推荐你使用@Autowired ?

    千次阅读 多人点赞 2021-11-05 11:04:59
    @Autowired注解相信每个Spring开发者都不...那么为什么IDEA会给出Field injection is not recommended这样的警告呢? 下面带着这样的问题,一起来全面的了解下Spring中的三种注入方式以及他们之间在各方面的优劣。 Sp
  • 导读:CRM客户关系管理系统的目的通过客户管理,产品管理,系统管理等功能同客户建立联并收集客户信息,此基础上满足客户"一对一"个性化服务。同时信息在企业的流程上得以流转,让客户得到高效的,满意的服务。本...
  • 为什么现在不看好 CV 方向了呢?

    千次阅读 2021-01-19 12:35:09
    作者:匿名用户 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 从一个cv内卷失败者的角度来聊一下。cv难的地方主要包含创新算法,...因此理论能力和工程能力都要具备。后者一般.
  • 手把手教你在华为HMS平台开发App 机器学习与人工智能、深度学习有什么关系?终于有人讲明白了 更多精彩???? 在公众号对话框输入以下关键词 查看更多优质内容! PPT | 读书 | 书单 | 硬核 | 干货 | 讲明白...
  • 原标题:为什么孩子总是会把字母、数字给写反?这里有妙招!孩子的字母总是写反过来,数字总是倒过来!这可着实让一些家长很苦恼。其实美国小孩也不例外,常常把单词写成这样...有些小朋友经常把Up写成了Uq, down写...
  • (是点光源的固有属性,表征光线的汇聚能力)定义:光源在给定方向的单位立体角中发射的光通量定义光源在该方向的(发)光强(度),解释:发光强度是针对点光源而言的,或者发光体的大小与照射距离相比...
  • 原函数和导函数的关系

    千次阅读 2021-01-12 08:44:26
    专业知识整理分享课题:探究原函数与导函数的关系首师大附中数学组王建华设计思路这节课就是在学完导数与积分之后,学生从大量的实例中对原函数与导函数的关系有了一定的认识的基础上展开教学的。由于这部分内容课本上...
  • 程序员必备的思维能力:逻辑思维

    千次阅读 多人点赞 2021-07-31 11:47:36
    更多关于思维能力的内容,尽在我的新书《程序员必备的思维能力》 “你讲话要有逻辑!” “你这逻辑不对!” “你的底层逻辑是什么?” “说说你的逻辑思维能力体现在哪儿?” 在日常交流中,我们会频繁的使用“逻辑...
  • 产品经理的私房菜 - 腾讯产品模型 - 学习能力

    万次阅读 多人点赞 2021-05-23 23:35:39
    产品经理的私房菜 - 腾讯产品模型 - 学习能力篇 ...“这份简历,对于我们来说,没有什么优势” “我见过太多,自以为,有一个内推机会,就一定能进的人” 看到这个回复,心里蛮难受的。 以前就和鹅厂
  • 设计模式之能力编排实现框架

    千次阅读 2021-03-24 18:04:19
    唠叨两句 大家好啊,已经一年多没写...了解能力编排框架带来的能力复用和业务隔离 颠覆传统开发习惯方法固定入参带来的方法扩展局限 前言 当我们做一个新项目开始的时候,我们总会想项目成型之后希望他能够有条不紊
  • 物联网和人工智能的关系什么?

    千次阅读 2021-11-17 15:58:11
    不久后,人工智能和物联网技术也终将结一体,我们也将进入AIOT时代。 物联网是什么? 物联网(The Internet of Things)简称IOT,其概念最早是在1999年由美国的麻省理工学院Auto–ID实验室明确提出的,是一个由...
  • 风机风量变化与转速的一次方成正比,风压变化与转速的二次方成正比,功率变化与转速的三次方成正比。风机风量风压转速的关系和计算 n:转速 N:功率 P:压力 Q:流量Q1/Q2=n1/n2 P1/P2=(n1/n2)平方 N1/N2=(n1/n2)...
  • 程序员必备的思维能力:抽象思维

    万次阅读 多人点赞 2021-02-12 18:03:28
    若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇抽象思维是我们工程师最重要的思维能力。因为软件技术 本质上就是一门抽象的艺术。我们的工作是存思维...
  • 数据速率、载波频率和带宽的关系

    千次阅读 2021-02-04 00:34:34
    为什么说载波频率越高 带宽越大。是因为高频段的频谱资源空白较多,可用上大带宽。低频段频谱资源被占用殆尽,所以只能往高频跑。 可以从码间干扰ISI的角度去解释一下,比如码间干扰限制了速率,而带宽又决定了码间...
  • 销售需要具备的8种能力

    千次阅读 2020-12-31 14:01:01
    当别人问你,To B销售人员需要具备什么样的能力,该如何回答? 在我没做销售之前,经常听到别人说,做销售很赚钱,只要会搞关系,会说话就行,当时,由于我的认知水平不高,就接受了这种说法。因为这个缘故,在我...
  • 点击上方蓝字关注我们客户之声(Voice of the Customer,简称VoC)是客户体验时代不可或缺的组成部分,也是谈论不休的话题之一。对于那些致力于“以客户中心”的企业来说...
  • 腾讯产品经理能力模型

    千次阅读 2021-01-23 22:47:47
    腾讯能力框架的基本定义,分为4类能力,共19个能力项目。这四类分别是:通用能力;专业知识;专业技能;组织影响力。 19个能力项目分数不同类型的能力,通用能力包括5个项目: 1.学习能力(基本素质) 2.执行力...
  • 它拥有众多的功能和广泛的关注度,截止目前在 Github 上已经有 68k 个 Star(译者注:2021-04 月底已 75k star): https://github.com/denoland/deno 在如此多强大功能的加持下,有个很重要的问题值得反思: 为什么 ...
  • C系列认证的宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力行业提供人才储备,国家数字化战略贡献力量。我们每天都会精选CSDN站内技术文.
  • 差分隐私与其他隐私计算技术的联系写在前面的话隐私计算什么是隐私计算?隐私计算发展趋势隐私计算的技术隐私计算体系结构安全多方计算联邦学习可行执行环境差分隐私比较应用场景发展趋势发展展望总结补充 写在前面...
  • 年纪轻轻,为什么要搞中间件开发? 五年前,香河大厂村,开张大吉。我和弟兄们雄心壮志,坐公交车去面试,谁知道求职不到半个月,每天平均1.3个人挂在八股文造火箭,一年内6个兄弟去了外包。 佛祖保佑!算命的说我...
  • 频率响应法是通过系统的开环频率特性和闭环频率特性的一些特征量间接地表征系统瞬态...虽然这些频域性能指标没有时域性能指标那样直观,但对于二阶系统而言,它们与时域性能指标间有着确定的对应关系;在高阶系统...
  • 我们最重要的目标之一是使 FIL 主网尽可能地安全并且具有弹性。我们网络安全策略的一部分是启动具有多种实现方式的 FIL 网络。今天,我们很高兴地宣布我们的第一个备用 FIL 实现,lotus。 几个月以来,我们一直在...
  • 数据治理(一)自研血缘关系

    千次阅读 2021-02-28 23:29:09
    数据治理(一)血缘关系 ...血缘关系按某个表中心又分为两个方向,当前表依赖到的是上游;当前表被依赖到的是下游。 1. 上游依赖 上游依赖表达的是当前表直接或间接依赖到哪些表 例子:有一天,一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 602,285
精华内容 240,914
关键字:

为什么关系比能力重要