关于在SQL Server中添加日期和时间的一个相当无害的问题引发了一场引人入胜的分类学辩论。

那么我们如何区分这些相关术语以及如何正确使用它们呢? >


记录

评论

一种推动工艺,另一种则被肮脏的潮人用来演奏音乐

有关SO的相关文章清楚地表明,这是一个重要的问题。

请注意,在Postgres和Oracle中,单行可以包含多个记录...

#1 楼

引用Joe Celko的话(不仅可以在整个网络上以及在他的Wikipedia条目中找到此参考,而且在某些会议上甚至可以在T恤上看到它):


行并不是记录。


很多人指出他是个脚的混蛋,只喜欢谦虚和口头上虐待新手,我承认这就是他的遭遇。但是我也亲自见过他-甚至和他一起吃饭-我无法告诉你他的现实角色与他的在线角色有何不同。我什至曾经抓过他打电话给行记录,他很尴尬(在这里有完整的背景故事)。



无论如何,说出你对这个人的在线角色的看法,但是他写了标准,而且这样的权威规定存在区别的事实应该告诉您一些信息。而且,当有人打电话给某行记录时,他不畏惧,我的许多同事(也是SQL Server领域的专家)也是如此。我们那个营地的人都相信他是对的。

例如Itzik Ben-Gan,一个明显的SQL Server专家。以下是他的培训工具包(考试70-461)中第一节课的引文:查询Microsoft SQL Server 2012:作为T-SQL中不正确术语的示例,人们通常,术语“字段”和“记录”分别指的是T-SQL所谓的“列”和“行”。字段和记录是物理的。字段是客户端应用程序的用户界面中的内容,而记录是文件和游标中的内容。表是逻辑的,它们具有逻辑的行和列。


认识Itzik,如果您向他发送电子邮件或在会议上碰到他,他会很乐意告诉您相同的内容。他认为,如果您将记录称为行,则表示您使用的术语不正确。

现在,作为一个由各种各样的人组成的行业,您可能会发现似乎在两者之间有非常微妙区别的材料(例如在另一个答案中发布的技术目标文章),并且您会发现该行业中有很多人认为他们是相同的(我认识Microsoft的几个人,以及像Brent Ozar这样的人,他们总是将其称为唱片)。但这并不能使他们正确,这只是他们看待问题的方式-他们认为逻辑和物理是相同的(至少在这种情况下),而且他们中的许多人可能认为我们其余的人只是花了太多时间的肛门保留物关于语义。

由于没有供应商会说“你应该称呼他们{records | rows}”,所以我们将永远处理这个论点,因为总会有人不了解逻辑。就像是有人说tomay-to和别人说tomah-to一样,总会有各种各样的人,从“他们是同一个人”开始,到“它们完全不同”-以及介于两者之间的许多阴影。同样,这并不能使其中的任何一个正确,因为没有人可以成为这方面的最终权威。但是在SQL Server空间中,绝对是占多数。


说,恕我直言,当您谈论表中的数据时,您将其称为行。在执行插入时,是在表中插入一行。运行更新时,您正在更新表中的一行。而当您执行SELECT时,您就是从表中检索行。

一旦您的应用程序拥有了记录,就可以自由地将其称为记录。但是,如果您说“我插入了唱片”,并且有人纠正了您,请不要生气。

#2 楼

Microsoft在其组织中的多个地方都提供了每个表条目的表格数据存储的正式名称(以达到我的目的的分类学定义)被称为“ ROW”。我提供证据ROW_NUMBERROWCOUNTROWVERSIONDataTable.Rows属性,其中DataTable是TSQL“表”对象的C#表示形式。在这种情况下,整个MSDN属性都鼓励使用row来引用作为表中一项的数据集合。 (请注意,我正试图避免使用“记录”或“行”来定义这一点,这是一个问题)。

不过,用语是应用程序处理用户“记录” ”。一条记录可能具有子记录的事实,可能无法由单个存储行直接表示该记录的独特之处。的确,一个表可以具有多对一的关联表,但是这些表不是连续存储的,而是在逻辑上存储的。

因此,表中的东西是行,而记录是是开发人员在实际使用中使用的东西。

评论


可以认为ROW是逻辑实体,而RECORD是物理实体。一个ROW可能有多个记录:一个在聚集索引中,几个在NC索引中。可以在页面中的记录和SLOB存储中的溢出记录之间分割不适合页面的行。行的字段的BLOB值可以跨越BLOB存储中的多个TEXT记录。堆中的一行可以由存根记录和前向记录组成。等等

–雷木斯·鲁萨努(Remus Rusanu)
13年1月13日在9:55



然后,您将完全从应用程序域中删除单词记录的用法,或者完全使领域变得混乱,使我们脱离了可定义的术语,而进入了理论数据库设计和实现细节的领域。您提出了很好的观点,但是从应用程序与数据库的惯例来看,这是80%的读者感到满意的地方,我的回答仍然成立。

– jcolebrand♦
13年1月13日在19:43

我不会与您的答案相抵触,也许我是对单词进行了错误处理。我仅介绍了SQL Engine本身如何看待事物,其中物理访问层将其称为“记录”,而查询处理(语言)层则将其称为“行”。

–雷木斯·鲁萨努(Remus Rusanu)
2013年1月13日20:39



我懂了。我仍然觉得浑浊。我向您保证,没有冒犯。

– jcolebrand♦
13年1月13日在21:48

#3 楼

我刚刚搜索了“信息技术-数据库语言-SQL第2部分:基础(SQL /基础)”文档,该文档定义了由所有主要RDBMS实施的SQL ANSI标准。
使用单词row正如预期的那样,主要是整个文档中的数百次。
record一词仅用于描述类似于Oracle PL / SQL中使用的记录的记录(专门描述ADA记录数据类型)。文档中有6条提及。
我认为这可以解决这个问题,并回答了双方的各种论点。

其他信息
摘自最新的免费版本)SQL标准,可以在wiscorp.com上找到(SQL标准页面有其他几个较旧的版本和修订版)。
搜索7IWD2-02-Foundation-2011-12.pdf,日期2011年12月21日揭示,在数据类型对应关系的规范中,单词行在文档中出现2277次,而单词记录仅出现21次(作为动词“ record”或结尾处的某些附录)。 SQL数据类型和主机语言类型(Ada,Pascal)。
此外,同一文档在第57页(重点是我的):

4.15.1表简介
此本节由ISO / IEC 9075-9中的4.10.1节“表简介”进行了修改。
表是零个或多个行的集合,其中每一行是一个或多个列val的序列ues。行的最特定类型是行类型。给定表的每一行都具有相同的行类型,称为该表的行类型。表中每一行的第i个字段的值就是表中该行的第i列的值。该行是可插入表中和从表中删除的最小数据单元。
表的程度及其每行的程度是该表的列数。表中的行数是其基数。基数为0(零)的表被认为是空的。
表可以是基表,派生表或临时表。


就使用SQL的DBMS而言:
行不是记录,字段不是列,表不是文件!

#4 楼

因为关系数据库很少单独使用,所以为了避免系统其他部分之间的混淆,我总是引用表,行和列。在客户端应用程序中,我们通常具有其他构造,包括数据读取器,数据集,数据行,数据表等-例如,“ field”通常用于屏幕上的数据输入,而Pascal的Record数据类型类似于C中的结构。

有时在系统设计中,“记录”的概念可能用来表示比单行更宽的内容。这可能是一排,它是历史。就像当我们谈论已删除的行时一样,我们可能指的是简单地用一行将其标记为已删除的行或将其“移动”到已删除的表中(而不是简单地缺少缺少的行,因为该行不存在,很难做到)固定下来)。

表,行和列是公认的术语,用于指代关系数据库中的这些实体,包括Codd和Date的论文和著作,以及大多数数据库专业人员更喜欢这种术语,因为它更加明确。

当人们谈论行和列时通常没有歧义-其他人理解您是在谈论底层数据库物理设计,而不是任何其他种类的物理设计之前的逻辑设计或任何随后出现的系统实体(如屏幕上的字段)中的工件。

#5 楼

尽管您的问题已经很好地回答了。我也想补充一点。也许您发现它在一定程度上有所帮助。另外,我的答案并不特定于SQL Server。这些单词可以互换使用。

 1          2         3              4 
--------------------------------------------------------------------
Row    =  Record  =  Tuple        =  Entity 

Column =  Field   =  Attribute    =  Attribute

table  =  File    =  Relation     =  Entity Types(or Entity Set)



4个术语在什么时候可以使用我们了解到当关系模型
2普遍使用DataBase books start with these terminology时会使用ER-Modules 3,因为它们在现实生活中以及文件系统中都非常普遍。

记录是存储系统中具有隐含含义的基本单位。在DBMS中,本章中使用的单词record描述了数据库表如何存储在磁盘块上。在DBMS中,record-oriented file-system是一个文件系统,其中文件存储为记录的集合。

#6 楼

语言在不断发展。几十年前,有识字的人们使用“索引”代替了简单的“索引”。当我们切换到“索引”时,我们消除了不必要的复杂性,并使该语言更有用。记住“索引”的复数是纯粹的开销-它丝毫没有帮助我们进行交流。没错,纳粹分子曾经喜欢纠正那些改用“索引”的人。当然,纳粹语法迷路了。如果整个事情保持足够长的相关性,这就是Occam的剃须刀消除不必要的细节的原因。
所以让我们放轻松-知道行和记录之间的差异绝对不会增加我们开发和维护数据库的能力。许多优秀的专业人员可以交替使用行和记录,但是却开发出了很棒的系统。因此,Occam的剃须刀最终应消除这种区别,下一代将不得不学习一个少用的事实。当然,如果那时SQL仍然有用。

#7 楼

引用CJ Date的书“数据库系统简介”
“这样的表的行可以被视为文件的记录...”

因此,对于数据库,它是行。

#8 楼

简短答案:


记录是一段存储(或收集)的数据。
一行是线性存储的记录。
尽可能使用

注意:表以线性方式存储记录,查询以线性方式返回结果

支持:

来自网络的其他定义:


SQL“行”(1、2)
SQL“记录”(1、2)
“记录”(1、2、3、4)
“行”(1,另请参见2、3、4)
行vs记录在StackOverflow上(1、2)

值得注意的是,SQL定义通常遵循英语定义。

如果您有一个定义的定义,请添加到注释中。
我对SQL标准或实现文档中的定义特别感兴趣。

引号是“行不是记录”。脱离上下文,这似乎与我之前的主张(以及许多数据库专业人员的主张)相矛盾。但是,如果您阅读了Joe Celko(aka --CELKO--)的整个帖子(1个搜索报价),则很显然,Joe Celko正在尝试纠正对一个误解的想法,Joe Celko认为这是由于该人的“ ……使用传统文件系统进行数据处理的背景知识……”。简而言之,Joe Celko说SQL行与其他系统中的记录工作不同。 Joe Celko并没有主张定义术语的权利/特权,他试图清除由于错误地将一种存储模型的原理应用于另一种存储模型而带来的误解。

评论


我感谢您所做的工作,并以为您投入了这项工作。我将注意到,Celko的差异化旨在得出RDBMS与RDBMS之前的平面文件COBOL系统之间的差异。 Ergo,他强调“行”是RDBMS模式的一部分,而“记录”是平面文件的组成部分。

–swasheck
2013年1月11日23:26