Answers:
引用Joe Celko的话(不仅可以在网上和Wikipedia条目中找到此参考文献,而且甚至可以在某些会议的T恤上看到它):
行不是记录。
很多人指出他是个古怪的混蛋,只喜欢谦虚和口头上虐待新手,我承认这就是他的遭遇。但是我也亲自见过他-甚至和他一起吃饭-我无法告诉你他的现实角色与他的在线角色有何不同。我什至曾经抓过他打电话给行记录,他很尴尬(在这里有完整的背景故事)。
无论如何,请说出您对这个人的在线角色的看法,但是他写了这个标准,并且这样一个权威表明存在区别的事实应该告诉您一些信息。而且,当有人打电话给某行记录时,他不畏惧,我的许多同事(也是SQL Server领域的专家)也是如此。我们那个营地的人都相信他是对的。
例如,明显的SQL Server专家Itzik Ben-Gan。以下是他的培训工具包(考试70-461)中第一节课的引文:查询Microsoft SQL Server 2012:
作为T-SQL中不正确术语的示例,人们经常使用术语“字段”和“记录”来分别指代T-SQL所谓的“列”和“行”。字段和记录是物理的。字段是客户端应用程序的用户界面中的内容,记录是文件和游标中的内容。表是逻辑的,它们具有逻辑的行和列。
而且,了解Itzik,如果您给他发送电子邮件或在会议上碰壁他,他会很乐意告诉您。他认为,如果您将记录称为行,则表示您使用的术语不正确。
现在,作为一个由各种各样的人组成的行业,您可能会发现似乎在两者之间有非常微妙区别的材料(例如在另一个答案中发布的技术目标文章),并且您会发现该行业中有很多人认为他们是相同的(我认识Microsoft的几个人,以及像Brent Ozar这样的人,他们总是将其称为唱片)。那并不能使他们正确,那只是他们的看待方式-他们认为逻辑和物理是相同的(至少在这种情况下),而且他们中的许多人可能认为我们其他人只是花了太多时间的肛门保留物关于语义。
由于没有供应商会说“您应该称呼他们{records | rows}”,因此我们将永远与这个争论打交道,因为总会有人不懂逻辑,不懂物理,或者受过不同的教导,或者就像某些人说tomay-to和其他人说tomah-to一样,总会有各种各样的人从“他们相同”到“他们完全不同” ”-介于两者之间。同样,这并不能使其中任何一个正确,因为没有人可以成为这方面的最终权威。但是在SQL Server领域,绝对占多数。
也就是说,恕我直言,当您谈论表中的数据时,您将其称为行。在执行插入时,是在表中插入一行。运行更新时,您正在更新表中的一行。并且当您执行SELECT时,您正在从表中检索行。
一旦您的应用程序拥有记录,便可以随时将其称为记录。但是,如果您说“我插入了唱片”,并且有人纠正了您,请不要生气。
Microsoft在其组织中的多个地方都提供了每个表条目的表格数据存储的正式名称(以达到我的目的的分类学定义)被称为“ ROW”。我提交了,和属性作为证据ROW_NUMBER
,其中a 是TSQL“表”对象的C#表示形式。在这种情况下,整个MSDN属性都鼓励使用来引用作为表中一项的数据集合。(请注意,我正试图避免使用“记录”或“行”来定义这一点,这是问题所在)ROWCOUNT
ROWVERSION
DataTable.Rows
DataTable
row
但是,有一个说法是应用程序处理用户“记录”。一条记录可能具有子记录的事实,可能无法由单个存储行直接表示该记录的独特之处。的确,一个表可以具有相关的多对一表,但是这些表不是连续存储的,而是在逻辑上存储的。
因此,一行是表中的东西,而记录是开发人员在实际使用中使用的东西。
我刚刚搜索了“信息技术-数据库语言-SQL第2部分:基础(SQL /基础)”文档,该文档定义了由所有主要RDBMS实施的SQL ANSI标准。
row
正如预期的那样,该词在整个文档中主要使用了数百次。
该词record
仅用于描述类似于Oracle PL / SQL中使用的记录的记录(专门描述ADA记录数据类型)。文件中有6条提及。
我认为这消除了这个问题,并回答了双方的各种论点。
附加信息
摘自wiscorp.com上(最新免费版本的草稿)的SQL标准副本(“ SQL Standards”页面具有其他几个较旧的版本和修订版)。
搜索日期为2011-12-21的7IWD2-02-Foundation-2011-12.pdf显示,单词行在文档中出现了2277次,而单词record仅出现了21次,或者是动词“ record”或最后一些附录中,说明了SQL数据类型和宿主语言类型(Ada,Pascal)的数据类型对应关系。
此外,同一文件在第57页(重点为我):
4.15.1表简介
本条款已由ISO / IEC 9075-9中的4.10.1节“表简介”进行了修改。
表是零或更多行的集合,其中每一行是一个或多个列值的序列。一个最具体类型行是行类型。给定表的每一行都具有相同的行类型,称为该表的行类型。每个的第i字段的值排在表中是的第i列的值列在表中。该行是可插入表中和从表中删除的最小数据单位。
表的程度及其每行的程度是该表的列数。表中的行数是其基数。基数为0(零)的表称为空表。
甲表要么是一个基地台,一个派生表,或瞬时表。
因此,对于使用SQL的DBMS而言:
行不是记录,字段不是列,表不是文件!
因为关系数据库很少单独使用,所以为了避免系统其他部分之间的混淆,我总是引用表,行和列。在客户端应用程序中,我们通常具有其他构造,包括数据读取器,数据集,数据行,数据表等-例如,“ field”通常用于屏幕上的数据输入,而Pascal的Record数据类型类似于C中的结构。
有时在系统设计中,“记录”的概念可能用于表示比单行更宽的内容。这可能是一排,它是历史。就像当我们谈论已删除的行时一样,我们可能指的是简单地将其标记为已删除并带有列或“移至”已删除表的行(而不是简单地缺少缺少的行,因为该行不存在,很难做到)固定下来)。“记录”一词的用法更加多样化。
表,行和列是在关系数据库中引用这些实体(包括Codd和Date的论文和著作)时通常被接受的术语,并且大多数数据库专业人员更喜欢这种术语,因为它更为明确。
当人们谈论行和列时,通常没有歧义-别人理解你是在谈论底层数据库物理设计,而不是逻辑设计之前的任何其他种类的工件,而不是物理设计或任何后来出现的系统实体,例如a上的字段。屏幕。
尽管您的问题已经很好地回答了。我也想补充一点。也许您会发现它在一定程度上有所帮助。另外我的答案并不特定于SQL Server
这些单词可以互换使用。
1 2 3 4
--------------------------------------------------------------------
Row = Record = Tuple = Entity
Column = Field = Attribute = Attribute
table = File = Relation = Entity Types(or Entity Set)
DataBase books start with these terminology
因为这些在现实生活中以及文件系统中都为人们所普遍使用。 记录是存储系统中具有隐含含义的基本单位。在DBMS中,“ record
使用”一词描述了数据库表如何存储在磁盘块上。在DBMS中,a record-oriented file-system
是一个文件系统,其中文件存储为记录的集合。
语言在不断发展。几十年前,有识之士使用“索引”代替了简单的“索引”。当我们切换到“索引”时,我们消除了不必要的复杂性,并使该语言更有用。记住“索引”的复数形式只是纯粹的开销-它丝毫没有帮助我们进行交流。毫无疑问,纳粹分子曾经喜欢纠正那些改用“索引”的人。当然,纳粹语法迷路了。如果整个物件保持足够长的相关时间,这就是Occam的剃须刀消除不必要的细节的方式。
因此,让我们放轻松-知道行和记录之间的差异绝对不会增加我们开发和维护数据库的能力。许多优秀的专业人员可以交替使用行和记录,但是却开发出了很棒的系统。因此,Occam的剃须刀最终应消除这种区别,下一代将不得不学习一个少用的事实。如果那时SQL当然仍然有用。
简短答案:
注意:表以线性方式存储记录,而查询以线性方式返回结果
技术支持:
网络上的其他定义:
值得注意的是,SQL定义通常遵循英语定义。
如果您认为应该在此处定义,请将其添加到注释中。
我对SQL标准的定义或实现文档特别感兴趣。
引号是“行不是记录”。脱离上下文,这似乎与我之前的主张(以及许多数据库专业人员的主张)相矛盾。但是,如果您阅读了Joe Celko(aka --CELKO--)的全文(1引用报价),则很显然,Joe Celko正在尝试纠正对一个误解的想法,Joe Celko认为这是由于该人的“ ……使用传统文件系统进行数据处理的背景知识……”。简而言之,Joe Celko说SQL行与其他系统中的记录工作不同。Joe Celko并没有主张定义术语的权利/特权,他试图消除由于错误地将一种存储模型应用于另一种存储模型而带来的误解。