อะไรคือความแตกต่างระหว่าง "บันทึก" และ "แถว" ใน SQL Server


56

มีคำถามที่ค่อนข้างอันตรายเกี่ยวกับการเพิ่มวันที่และเวลาใน SQL Serverที่ตั้งปิดการอภิปรายอนุกรมวิธานค่อนข้างน่าสนใจ

ดังนั้นเราจะแยกความแตกต่างระหว่างคำที่เกี่ยวข้องเหล่านี้และวิธีการใช้งานอย่างถูกต้องได้อย่างไร

แถว

บันทึก


32
หนึ่งขับเคลื่อนยานฝีมืออื่น ๆ ถูกใช้โดย hipsters สกปรกในการเล่นเพลง
billinkc

1
โพสต์ที่เกี่ยวข้องกับ SO แสดงให้เห็นอย่างชัดเจนว่านี่เป็นคำถามที่สำคัญ
dezso

โปรดทราบว่าใน Postgres และ Oracle แถวเดียวสามารถมีได้หลายระเบียน ...
a_horse_with_no_name

คำตอบ:


69

หากต้องการอ้างอิง Joe Celko (ไม่เพียง แต่คุณจะพบการอ้างอิงนี้ทั่วทั้งเว็บและในรายการ Wikipedia ของเขาแต่คุณยังจะเห็นมันบนเสื้อยืดในการประชุม)

แถวไม่ใช่เรคคอร์ด

ผู้คนจำนวนมากชี้ให้เขาเห็นว่าเป็นคนฉาวโฉ่ที่ชอบทำตัวไร้เดียงสาและใช้วาจาเหยียดหยามในมือใหม่และฉันจะยอมรับว่านั่นเป็นวิธีที่เขาเจอ แต่ฉันยังได้พบเขาด้วยตัวเอง - แม้แต่แบ่งปันอาหารกับเขา - และฉันไม่สามารถบอกคุณได้ว่าบุคลิกในชีวิตจริงของเขาแตกต่างจากหน้าออนไลน์ของเขาอย่างไร ฉันเคยจับเขาเรียกระเบียนแถวและเขาก็อายมาก ( เต็ม backstory ที่นี่ )

ฉันสวมเสื้อตัวนี้จริง ๆ กับการประชุม PASS ในเมืองเกรปไวน์รัฐเท็กซัสในปี 2549

ไม่ว่าในกรณีใดพูดในสิ่งที่คุณต้องการเกี่ยวกับตัวละครออนไลน์ของผู้ชาย แต่เขาเขียนมาตรฐานและความจริงที่ว่าผู้มีอำนาจดังกล่าวบอกว่ามีความแตกต่างควรบอกคุณบางอย่าง และมากที่สุดเท่าที่เขา cringes เมื่อมีคนเรียกระเบียนแถวดังนั้นเพื่อนร่วมงานของฉันหลายคน - ที่ยังเป็นผู้เชี่ยวชาญในโลกของ SQL Server และพวกเราในค่ายนั้นเชื่อว่าเขาพูดถูก

ตัวอย่างเช่น Itzik Ben-Gan กูรู SQL Server ที่ชัดเจน นี่เป็นข้อความที่อ้างถึงจากบทเรียนแรกในชุดฝึกอบรม (สอบ 70-461): การสืบค้น Microsoft SQL Server 2012 :

เป็นตัวอย่างของคำที่ไม่ถูกต้องใน T-SQL ผู้คนมักจะใช้คำว่า "field" และ "บันทึก" เพื่ออ้างถึงสิ่งที่ T-SQL เรียกว่า "คอลัมน์" และ "แถว" ตามลำดับ ฟิลด์และระเบียนเป็นฟิสิคัล เขตข้อมูลคือสิ่งที่คุณมีในส่วนติดต่อผู้ใช้ในแอปพลิเคชันไคลเอนต์และระเบียนเป็นสิ่งที่คุณมีในไฟล์และเคอร์เซอร์ ตารางเป็นลอจิกและมีลอจิคัลแถวและคอลัมน์

และรู้ว่า Itzik ถ้าคุณส่งอีเมลถึงเขาหรือบอกเขาในการประชุมเขาจะบอกคุณอย่างมีความสุข หากคุณเรียกระเบียนหนึ่งแถวตามความเห็นของเขาแสดงว่าคุณไม่ได้ใช้คำศัพท์อย่างถูกต้อง

ตอนนี้เป็นอุตสาหกรรมที่เต็มไปด้วยผู้คนทุกประเภทคุณมีแนวโน้มที่จะพบเนื้อหา (เช่นบทความเป้าหมายเทคโนโลยีที่โพสต์ในคำตอบอื่น) ที่ดูเหมือนจะสร้างความแตกต่างที่ลึกซึ้งมากระหว่างคนทั้งสองและคุณจะพบคนมากมายในอุตสาหกรรม พิจารณาพวกเขาเหมือนกัน (ฉันรู้ว่าหลายคนที่ Microsoft และคนอื่น ๆ เช่น Brent Ozar ที่จะเรียกมันว่าบันทึกเสมอ) นั่นไม่ได้ทำให้ถูกต้องนั่นเป็นเพียงวิธีการมองของพวกเขา - พวกเขามองตรรกะและทางกายภาพเหมือนกัน (อย่างน้อยในบริบทนี้) และพวกเขาหลายคนอาจคิดว่าพวกเราที่เหลือเป็นแค่การใช้เวลามากเกินไป ในความหมาย

เนื่องจากไม่มีผู้ขายจะพูดว่า "เจ้าจะเรียกพวกเขาว่า {บันทึก | แถว}" เราจะต้องจัดการกับข้อโต้แย้งนี้ตลอดไปเพราะจะมีคนที่ไม่ได้รับตรรกะกับร่างกายหรือได้รับการสอนที่แตกต่างกันหรือ มาจากพื้นเพการเข้าถึงหรือการเขียนโปรแกรม ฯลฯ เช่นเดียวกับที่บางคนพูดว่าโทมายะและคนอื่น ๆ พูดโทมาห์ถึงจะมีคนหลากหลายตั้งแต่ "พวกเขาเหมือนกัน" ถึง "พวกเขาต่างกันโดยสิ้นเชิง "- และอีกหลายเฉดสีในระหว่าง อีกครั้งนั่นไม่ได้ทำให้พวกเขาถูกต้องเพราะไม่มีใครสามารถเป็นผู้มีอำนาจสูงสุดในเรื่องนี้ แต่ในพื้นที่ของ SQL Server มีส่วนใหญ่แน่นอน


ที่กล่าวว่า IMHO เมื่อคุณกำลังพูดถึงข้อมูลที่อยู่ในตารางคุณเรียกมันว่าแถว เมื่อคุณทำการแทรกคุณกำลังแทรกแถวลงในตาราง เมื่อคุณเรียกใช้การปรับปรุงคุณกำลังปรับปรุงแถวที่อยู่ในตาราง และเมื่อคุณทำการเลือกคุณจะดึงแถวจากตาราง

อย่าลังเลที่จะเรียกมันว่าบันทึกเมื่อใบสมัครของคุณมีการระงับ แต่อย่าโกรธถ้าคุณพูดว่า "ฉันแทรกบันทึก" และมีคนแก้ไขคุณ


33

Microsoft มีหลายแห่งในองค์กรของพวกเขาหากชื่ออย่างเป็นทางการสำหรับการจัดเก็บข้อมูลแบบตารางต่อรายการตาราง (เพื่อกำหนดคำจำกัดความทางเศรษฐศาสตร์ที่ให้บริการตามวัตถุประสงค์ของฉันเอง) เรียกว่า "ROW" ฉันส่งเป็นหลักฐานROW_NUMBER, ROWCOUNT, ROWVERSIONและDataTable.Rowsคุณสมบัติที่DataTableเป็นตัวแทน C # ของ TSQL "ตาราง" วัตถุ ในกรณีนี้คุณสมบัติ MSDN โดยรวมสนับสนุนให้ใช้rowเพื่ออ้างถึงการรวบรวมข้อมูลที่เป็นหนึ่งรายการในตาราง (หมายเหตุฉันพยายามหลีกเลี่ยงการใช้ "บันทึก" หรือ "แถว" เพื่อกำหนดสิ่งนี้ซึ่งเป็นประเด็นคำถาม)

อย่างไรก็ตาม parlance คือแอปพลิเคชันเกี่ยวข้องกับผู้ใช้ "บันทึก" สิ่งที่ไม่ซ้ำกันเกี่ยวกับระเบียนที่อาจไม่ได้แสดงโดยตรงโดยแถวที่จัดเก็บข้อมูลเดียวคือข้อเท็จจริงที่ว่าระเบียนสามารถมีระเบียนย่อยได้ True, ตารางสามารถเกี่ยวข้องกับหลายต่อหลายตาราง แต่สิ่งเหล่านั้นไม่ได้ถูกจัดเก็บอย่างต่อเนื่อง

ดังนั้นแถวคือสิ่งที่อยู่ในตารางและบันทึกเป็นสิ่งที่นักพัฒนาใช้งานได้จริงในการใช้งาน


8
เราสามารถยืนยันได้ว่า ROW เป็นเอนทิตีแบบลอจิคัลขณะที่ RECORD เป็นเอนทิตีทางกายภาพ ROW อาจมีหลายระเบียน: หนึ่งรายการในดัชนีคลัสเตอร์หลายรายการในดัชนี NC แถวที่ไม่พอดีกับหน้าสามารถแยกระหว่างเรคคอร์ดในหน้าและเรคคอร์ดโอเวอร์โฟลว์ในที่จัดเก็บ SLOB ค่า BLOB ของเขตข้อมูลของแถวสามารถครอบคลุมหลายระเบียน TEXT ในที่จัดเก็บ BLOB แถวในฮีปอาจประกอบด้วยเรคคอร์ดสตับและเรคคอร์ดไปข้างหน้า ฯลฯ ฯลฯ
Remus Rusanu

จากนั้นคุณจะลบการใช้บันทึกคำศัพท์ออกจากโดเมนแอพอย่างสมบูรณ์หรือทำให้น้ำยุ่งเหยิงและทำให้เราห่างไกลจากข้อกำหนดที่กำหนดได้และเข้าสู่ขอบเขตของการออกแบบฐานข้อมูลเชิงทฤษฎีและรายละเอียดการใช้งาน คุณยกระดับคะแนนที่ดี แต่จากการประชุมของแอปเทียบกับฐานข้อมูลซึ่งเป็นที่ 80% ของผู้อ่านของเราจะสะดวกสบายคำตอบของฉันยังคงยืนอยู่ฉันถือ
jcolebrand

4
ฉันไม่ได้ขัดแย้งกับคำตอบของคุณบางทีฉันอาจพูดผิดคำ ฉันนำเสนอเฉพาะวิธีที่สิ่งต่าง ๆ ถูกมองเห็นโดย SQL Engine เองซึ่งเลเยอร์การเข้าถึงแบบฟิสิคัลเรียกว่า 'เร็กคอร์ด' กับเลเยอร์การประมวลผลแบบสอบถาม (ภาษา) ซึ่งจัดการเลเยอร์
Remus Rusanu

ฉันเห็น. ฉันยังรู้สึกเหมือนมันเป็นโคลนน้ำ ไม่มีความผิดฉันรับรองกับคุณ
jcolebrand

31

ฉันเพิ่งค้นหาผ่านเอกสาร "เทคโนโลยีสารสนเทศ - ภาษาฐานข้อมูล - SQL ตอนที่ 2: รากฐาน (SQL / มูลนิธิ)" ซึ่งกำหนดมาตรฐาน ANSI สำหรับ SQL ตามที่ใช้งานโดย RDBMS ที่สำคัญทั้งหมด

คำrowนี้ใช้เป็นหลักตลอดทั้งเอกสารหลายร้อยครั้งตามที่คาดไว้

คำrecordนี้ใช้เพื่ออธิบายระเบียนที่คล้ายกับระเบียนที่ใช้ใน Oracle PL / SQL (อธิบายประเภทข้อมูลระเบียน ADA โดยเฉพาะ) 6 กล่าวถึงในเอกสาร

ฉันคิดว่านี่เป็นการเคลียร์คำถามนี้และตอบข้อโต้แย้งต่าง ๆ ของทั้งสองฝ่าย


ข้อมูลเพิ่มเติม

จากสำเนาของมาตรฐาน SQL ฉบับร่างฉบับล่าสุดซึ่งมีอยู่ที่ wiscorp.com (หน้ามาตรฐานของ SQL มีเวอร์ชันเก่ากว่าและการแก้ไขอื่น ๆ )

ค้นหา7IWD2-02-Foundation-2011-12.pdfโดยมีวันที่2011-12-21เปิดเผยว่าแถวคำปรากฏ 2277 ครั้งในเอกสารในขณะที่บันทึกคำปรากฏเพียง 21 ครั้งไม่ว่าจะเป็นคำกริยา "บันทึก" หรือในภาคผนวกบางส่วนในที่สุดในรายละเอียดของความสอดคล้องชนิดข้อมูลสำหรับชนิดข้อมูล SQL และประเภทภาษาโฮสต์ (Ada, Pascal)

นอกจากนี้เอกสารเดียวกันมีที่หน้า 57 (เน้นที่เหมือง):

4.15.1 ตารางเบื้องต้น

ข้อย่อยนี้ได้รับการแก้ไขโดย Subclause 4.10.1,“ Introduction to tables” ใน ISO / IEC 9075-9

ตารางคือชุดของศูนย์หรือมากกว่าแถวที่แต่ละแถวเป็นลำดับของค่าคอลัมน์อย่างน้อยหนึ่งค่า ประเภทที่เฉพาะเจาะจงมากที่สุดของแถวเป็นชนิดแถว ทุกแถวของตารางที่กำหนดมีประเภทแถวเดียวกันเรียกว่าประเภทแถวของตารางนั้น ค่าของฟิลด์ i-th ของทุกแถวในตารางคือค่าของคอลัมน์ i-th ของแถวนั้นในตาราง แถวคือหน่วยข้อมูลที่เล็กที่สุดที่สามารถแทรกลงในตารางและลบออกจากตาราง

ระดับของตารางและระดับของแต่ละแถวคือจำนวนคอลัมน์ของตารางนั้น จำนวนแถวในตารางคือจำนวนเชิงการนับ ตารางที่มีความสำคัญเชิงหัวใจเป็น 0 (ศูนย์) ถูกกล่าวว่าว่างเปล่า

ตารางเป็นทั้งตารางฐานเป็นตารางมาหรือตารางชั่วคราว


ดังนั้นเท่าที่ DBMSs ที่ใช้ SQL เป็นห่วง:

แถวไม่ใช่เรคคอร์ด , ฟิลด์ไม่ใช่คอลัมน์, ตารางไม่ใช่ไฟล์!


14

เนื่องจากฐานข้อมูลเชิงสัมพันธ์นั้นไม่ค่อยใช้ในการแยกเพื่อหลีกเลี่ยงความสับสนระหว่างส่วนอื่น ๆ ของระบบฉันมักจะอ้างถึงตารางและแถวและคอลัมน์ ในแอปพลิเคชันไคลเอนต์เรามักจะมีโครงสร้างอื่น ๆ รวมถึงดาต้าเรเดอร์, ดาต้าเซ็ต, ดาตาล็อก, ดาต้าดาต้า, ฯลฯ - ตัวอย่างเช่น "ฟิลด์" มักใช้สำหรับการป้อนข้อมูลบนหน้าจอและ Pascal .

บางครั้งในการออกแบบระบบความคิดของ "บันทึก" อาจถูกนำมาใช้เพื่อหมายถึงบางสิ่งที่กว้างกว่าแถวเดียว มันอาจจะเป็นแถวและมันเป็นประวัติศาสตร์ เช่นเดียวกับเมื่อเราพูดถึงแถวที่ถูกลบเราอาจหมายถึงแถวที่ถูกทำเครื่องหมายว่าถูกลบด้วยคอลัมน์หรือ "ย้าย" ไปยังตารางที่ถูกลบ (และไม่ใช่แค่การขาดแถวซึ่งโดยไม่มีอยู่แล้วค่อนข้างยากที่จะ ปักหมุดลง) มีการใช้คำศัพท์ที่หลากหลายมากขึ้น

โดยทั่วไปแล้วตาราง, แถวและคอลัมน์เป็นคำศัพท์ที่ได้รับการยอมรับสำหรับการอ้างอิงถึงเอนทิตีเหล่านี้ในฐานข้อมูลเชิงสัมพันธ์รวมถึงเอกสารและการทำงานตาม Codd และ Date และผู้เชี่ยวชาญด้านฐานข้อมูลส่วนใหญ่ต้องการคำศัพท์นี้เนื่องจากมีความชัดเจนมากกว่า

โดยทั่วไปจะไม่มีความกำกวมเมื่อพูดถึงแถวและคอลัมน์ - คนอื่น ๆ เข้าใจว่าคุณกำลังพูดถึงการออกแบบทางกายภาพของฐานข้อมูลและไม่ได้มีสิ่งประดิษฐ์ประเภทอื่น ๆ จากการออกแบบเชิงตรรกะก่อนการออกแบบทางกายภาพหรือเอนทิตีระบบอื่น ๆ จอภาพ


9

แม้ว่าคำถามของคุณจะได้รับคำตอบที่ดีอยู่แล้ว ฉันต้องการเพิ่มคะแนนของฉันด้วย คุณอาจจะพบว่ามันมีประโยชน์สำหรับบางคน คำตอบของฉันไม่เฉพาะกับ SQL Server

คำเหล่านี้ใช้แทนกันได้

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

Column =  Field   =  Attribute    =  Attribute

table  =  File    =  Relation     =  Entity Types(or Entity Set)
  • 4 คำศัพท์ที่ใช้งานได้ดีเมื่อเราเรียนรู้ ER-Modules
  • 3 ใช้เมื่อ Relational Model
  • 2 ฉากทั่วไปDataBase books start with these terminologyเพราะสิ่งเหล่านี้มักถูกใช้โดยคนทั่วไปในชีวิตจริงรวมถึงในระบบไฟล์

บันทึกเป็นหน่วยพื้นฐานในระบบจัดเก็บข้อมูลที่มีความหมายโดยนัย ใน DBMS คำที่recordใช้ในบทจะอธิบายถึงวิธีการที่ตารางฐานข้อมูลจัดเก็บบนบล็อกดิสก์ ใน DBMS record-oriented file-systemเป็นระบบไฟล์ที่จัดเก็บไฟล์เป็นชุดของบันทึก


9

ภาษาพัฒนาอย่างต่อเนื่อง ไม่กี่ทศวรรษที่ผ่านมาคนที่มีความรู้ใช้ "ดัชนี" แทนที่จะเป็น "ดัชนี" ที่ง่ายกว่า เมื่อเราเปลี่ยนเป็น "ดัชนี" เราจะขจัดความยุ่งยากที่ไม่จำเป็นและทำให้ภาษามีประโยชน์มากขึ้น ความจำเป็นในการจดจำพหูพจน์สำหรับ "ดัชนี" นั้นเป็นค่าใช้จ่ายที่บริสุทธิ์ - มันไม่ได้ช่วยให้เราสื่อสารได้ อย่าทำผิดเลยเคยมีไวยากรณ์นาซีที่ชอบแก้ไขผู้ที่เปลี่ยนเป็น "ดัชนี" แน่นอนว่านาซีไวยากรณ์หายไป นี่คือวิธีที่มีดโกนของ Occam กำจัดรายละเอียดที่ไร้ประโยชน์หากสิ่งทั้งหมดยังคงมีความเกี่ยวข้องมานานพอ

ดังนั้นขอให้เราเข้าใจง่าย - การทราบถึงความแตกต่างระหว่างแถวและเร็กคอร์ดจะไม่เพิ่มความสามารถของเราในการพัฒนาและดูแลฐานข้อมูล ผู้เชี่ยวชาญที่ยอดเยี่ยมหลายคนใช้แถวและบันทึกสลับกันได้ แต่พัฒนาระบบที่ยอดเยี่ยม ดังนั้นมีดโกนของ Occam ควรกำจัดความแตกต่างในที่สุดและคนรุ่นต่อไปจะต้องเรียนรู้ความจริงที่ไร้ประโยชน์ ถ้าแน่นอน SQL ยังคงเกี่ยวข้องในเวลานั้น


5

ในการอ้างอิงหนังสือของ CJ Date "คำแนะนำเกี่ยวกับระบบฐานข้อมูล" " แถวของตารางดังกล่าวสามารถถือเป็นบันทึกของไฟล์ ... "

ดังนั้นสำหรับฐานข้อมูลมันคือแถว


4

คำตอบสั้น ๆ :

  • บันทึกเป็นข้อมูลที่เก็บไว้ (หรือรวบรวม)
  • แถวคือระเบียนที่จัดเก็บแบบเชิงเส้น
  • หากเป็นไปได้ให้ใช้คำที่เฉพาะเจาะจงมากขึ้น

หมายเหตุ: ตารางจัดเก็บเรคคอร์ดเป็นเส้นตรงและคิวรีส่งคืนผลลัพธ์เป็นเส้นตรง

การสนับสนุน :

คำจำกัดความเพิ่มเติมจากทั่วทั้งเว็บ:

  • SQL "แถว" ( 1 , 2 )
  • SQL "บันทึก" ( 1 , 2 )
  • "บันทึก" ( 1 , 2 , 3 , 4 )
  • "row" ( 1 , ดู2 , 3 , 4 ด้วย )
  • Row vs Record on StackOverflow ( 1 , 2 )

เป็นที่น่าสังเกตว่าคำจำกัดความของ SQL เป็นไปตามข้อกำหนดของภาษาอังกฤษ

หากคุณมีคำจำกัดความที่คุณคิดว่าควรจะอยู่ที่นี่โปรดเพิ่มลงในความคิดเห็น
ฉันสนใจเป็นพิเศษในคำจำกัดความจากมาตรฐาน SQL หรือเอกสารของการดำเนินงาน

คำพูดถูกนำขึ้นมา "แถวไม่ใช่เร็กคอร์ด" นำออกจากบริบทนี้ดูเหมือนจะขัดแย้งยืนยันก่อนหน้าของฉัน (และบรรดาผู้เชี่ยวชาญด้านฐานข้อมูลจำนวนมาก) แต่ถ้าคุณอ่านบทความทั้งหมด ( 1ค้นหาคำพูด) โดย Joe Celko (aka --CELKO--) มันชัดเจนว่า Joe Celko พยายามแก้ไขความเข้าใจผิดของบุคคลที่ Joe Celko เชื่อว่าเกิดขึ้นจากบุคคลนั้น " ... พื้นหลังในการประมวลผลข้อมูลด้วยระบบไฟล์ดั้งเดิม ... " ในระยะสั้น Joe Celko บอกว่าแถว SQL ไม่ทำงานเหมือนกับระเบียนในระบบอื่น Joe Celko ไม่ได้อ้างสิทธิ์ / สิทธิพิเศษในการกำหนดคำศัพท์เขาพยายามที่จะกำจัดความเข้าใจที่ผิดพลาดที่เกิดจากการใช้หลักการหนึ่งรูปแบบการจัดเก็บกับอีกแบบหนึ่งอย่างไม่ถูกต้อง


3
ฉันซาบซึ้งในงานและคิดว่าคุณใส่เข้าไปในนี้ ฉันจะสังเกตได้ว่าความแตกต่างของ Celko นั้นมีจุดประสงค์เพื่อดึงความแตกต่างระหว่าง RDBMS และระบบ flat-COBOL ที่นำหน้า RDBMS ดังนั้นเขาจึงเน้น "แถว" เป็นส่วนหนึ่งของ RDBMS schema และ "บันทึก" เป็นส่วนหนึ่งของไฟล์แฟล็ต
swasheck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.