Яка різниця між "записом" та "рядком" у SQL Server?


56

Виникло досить нешкідливе питання щодо додавання дат та часу в SQL Server, що спричинило досить захоплюючу таксономічну дискусію.

Тож як ми розмежовуємо ці споріднені терміни і як ми їх правильно використовуємо?

Ряд

Запишіть



1
Пов’язана публікація щодо SO чітко показує, що це важливе питання.
дезсо

Зауважте, що в Postgres та Oracle один рядок може містити кілька записів ...
a_horse_with_no_name

Відповіді:


69

Процитуючи Джо Селко (ви можете не тільки знайти цю посилання в Інтернеті та в його Вікіпедії , але ви навіть побачите її на футболках на деяких конференціях):

Рядки - це не записи.

Дуже багато людей відзначають його як педантичного ривка, який просто любить принижуватись і словесно зловживати новичками, і я визнаю, що саме так він натрапляє. Але я також особисто зустрічався з ним - навіть поділився їжею з ним - і не можу сказати, наскільки його особистість у реальному житті відрізняється від його інтернет-фронту. Я навіть одного разу спіймав його, як він називає записи рядків, і він дуже збентежився ( тут повна історія ).

Я насправді носив цю сорочку на конференції PASS у Грейпвайн, штат Техас, у 2006 році

У будь-якому випадку скажіть, що ви будете про онлайн-персонажа хлопця, але він написав стандарт , і той факт, що така влада диктує, що є відмінність, повинен вам щось сказати. І настільки, наскільки він стискається, коли хтось називає запис рядком, так це робить і багато моїх колег - які також є експертами у світі SQL Server. І ті з нас у цьому таборі вважають, що він правий.

Наприклад, Іцік Бен-Ган, явний гуру SQL Server. Ось цитата з першого уроку його навчального набору (іспит 70-461): Запит на Microsoft SQL Server 2012 :

Як приклад неправильних термінів у T-SQL, люди часто використовують терміни "поле" та "запис" для позначення того, що T-SQL називає відповідно "стовпцем" та "рядком". Поля та записи фізичні. Поля - це те, що у вас в користувацьких інтерфейсах у клієнтських додатках, а записи - у файлах та курсорах. Таблиці є логічними, і вони мають логічні рядки та стовпці.

І, знаючи Іцика, якщо ви надішлете йому електронний лист або розіграєте його на конференції, він із задоволенням скаже вам те саме. Якщо ви називаєте рядок записом, на його думку, термінологію ви не використовуєте правильно.

Тепер, будучи галуззю, повної різного роду, ви, швидше за все, знайдете матеріали (наприклад, статті про технічні цілі, розміщені в іншій відповіді), які, здається, роблять дуже тонкі відмінності між ними, і ви знайдете багатьох людей у ​​цій галузі. вважайте їх однаковими (я знаю декількох людей у ​​Microsoft та інших людей, як Брент Озар, які просто завжди називатимуть це записом). Це не робить їх правильними, це лише їхній погляд на це - вони розглядають логічне та фізичне як однакове (принаймні в цьому контексті), і багато хто з них, напевно, вважають, що решта з нас - це лише анальні утримувачі, витрачаючи занадто багато часу з семантики.

Оскільки жоден продавець не зможе сказати "ти будеш називати їх {записи | рядки}", ми назавжди будемо мати справу з цим аргументом, тому що завжди знайдеться хтось, хто не сприймає логічне проти фізичного, або його навчали інакше, або прийшов з фоном Access або програмуванням і т. д. Так само, як деякі кажуть tomay-to, а інші кажуть tomah-to, завжди знайдуться різноманітні люди, які варіюються від "вони однакові" до ", вони абсолютно різні "- і багато відтінків між ними. Знову ж таки, це не робить жодного з них правильним, адже ніхто не може бути остаточним авторитетом у цьому. Але в просторі SQL Server, безумовно, є більшість.


Однак, IMHO, коли ви говорите про дані, що знаходяться в таблиці, ви називаєте це рядком. Виконуючи вставку, ви вставляєте рядок у таблицю. Під час запуску оновлення ви оновлюєте рядок, що знаходиться в таблиці. І коли ви виконуєте SELECT, ви отримуєте рядки з таблиці.

Не соромтеся називати це записом, як тільки ваша програма має його. Але не гнівайся, якщо ти скажеш: "Я вставив запис", і хтось тебе виправить.


33

Microsoft в декількох місцях своєї організації за умови, що офіційне найменування для табличного зберігання даних за таблицею (для монети таксономічного визначення, яке відповідає моїм власним призначенням) називається "ДОСТУП". Я представляю в якості доказу ROW_NUMBER, ROWCOUNT, ROWVERSIONі DataTable.Rowsмайно, де DataTableє C # вистава «таблиці» об'єкт TSQL. У цьому випадку властивості MSDN в цілому заохочують використання rowдля посилання на збір даних, що є одним записом у таблиці. (зауважте, я намагаюся уникати використання "запису" або "рядка", щоб визначити це, що є питанням)

Однак мова йде про те, що програма стосується "записів" користувачів. Щось унікальне у записі, який може бути не представлений безпосередньо одним рядком пам’яті, це той факт, що запис може мати підзапис. Щоправда, таблиця може мати пов’язані з багатьма таблицями один до одного, але вони не зберігаються безперервно, але вони зберігаються логічно пов'язаними.

Отже, рядок - це річ у таблиці, а запис - це те, з чим розробник працює у практичному використанні.


8
Можна стверджувати, що ROW - це логічна сутність, тоді як RECORD - фізична сутність. ROW може мати декілька записів: один у кластерному індексі, кілька у індексах NC. Рядок, який не входить у сторінку, можна розділити між записом на сторінці та переливом записів у сховищі SLOB. Значення поля рядка BLOB може охоплювати кілька TEXT-записів у сховищі BLOB. Рядок у купі може складатися із запису заглушки та запису вперед. І т. Д.
Рем Русану

Тоді ви повністю видалили б слово запису з домену додатків, або повністю затуманили води і відвели нас від визначених термінів і в область теоретичних деталей розробки та впровадження бази даних. Ви піднімаєте хороші бали, але за умови збору додатків проти баз даних, де 80% наших читачів буде комфортно, моя відповідь все ще стоїть, я вважаю.
jcolebrand

4
Я не суперечу вашій відповіді, можливо, я слів-ед помилявся. Я представив лише те, як все бачить сам SQL Engine, де фізичний рівень доступу називає їх "записи" порівняно з шаром обробки мови (мови), який обробляє "рядки".
Рем Русану

Я бачу. Я все ще відчуваю, що це замулює води. Без правопорушень, запевняю вас.
jcolebrand

31

Я щойно переглянув документ "Інформаційні технології - Мови баз даних - SQL Частина 2: Фундація (SQL / Foundation)", який визначає стандарт 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 Вступ до таблиць

Цей підпункт модифікований підпунктом 4.10.1, "Вступ до таблиць", в ISO / IEC 9075-9.

Таблиця - це сукупність нульових або більше рядків, де кожен рядок є послідовністю одного або більше значень стовпців. Найбільш специфічний тип рядка - це тип рядка. Кожен рядок даної таблиці має один і той же тип рядка, який називається типом рядка цієї таблиці. Значення i-го поля кожного рядка таблиці є значенням i-го стовпця цього рядка в таблиці. Рядок - це найменша одиниця даних, яку можна вставити в таблицю та видалити з таблиці.

Ступінь таблиці та ступінь кожного її ряду - це кількість стовпців цієї таблиці. Кількість рядків у таблиці - це її кардинальність. Таблиця, чия кардинальність дорівнює 0 (нуль), вважається порожньою.

Таблиця є або базової таблицею , A похідною таблиці або перехідною таблиця .


Що стосується СУБД, які використовують SQL:

Рядки - це не записи , поля не стовпці, таблиці не файли!


14

Оскільки реляційні бази даних рідко використовуються ізольовано, щоб уникнути плутанини між іншими частинами систем, я завжди посилаюся на таблиці, рядки та стовпці. У клієнтських програмах у нас зазвичай є інші конструкції, включаючи читалки даних, набори даних, дані, таблиці даних тощо - наприклад, "field" часто використовується для екранного введення даних, а Pascal має тип даних Record, схожий на структуру в C .

Іноді в дизайні системи ідея "Запису" може використовуватися для позначення чогось більшого, ніж один рядок. Це може бути ряд, і це історія. Так само, як коли ми говоримо про видалений рядок, ми можемо мати на увазі рядок, який просто позначений як видалений зі стовпцем або "переміщений" до видаленої таблиці (а не просто відсутність рядка, який, як не існує, досить важко приколоти). Існує просто більш різноманітне використання терміна Record.

Таблиці, рядки та стовпці є загальноприйнятою термінологією для посилань на ці сутності у реляційних базах даних, включаючи документи та роботи 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-модулі
  • 3 використання, коли реляційна модель
  • 2 загальна сцена, DataBase books start with these terminologyтому що вони часто використовуються людьми в реальному житті, також у файловій системі.

Запис - це основна одиниця в системі зберігання, яка має неявне значення. У СУБД слово recordвикористання в главі описує, як таблиці баз даних зберігаються на дискових блоках. У СУБД a record-oriented file-system- це файлова система, де файли зберігаються як колекції записів.


9

Мова постійно розвивається. Кілька десятиліть тому грамотні люди використовували "індекси" замість простіших "індексів". Коли ми перейшли на "індекси", ми усунули непотрібне ускладнення і зробили мову більш корисною. Необхідність запам’ятовування множини для «індексу» була чистою головою - це жодним чином не допомогло нам спілкуватися. Не помиляйтеся, колись були гітлерівці, які любили виправляти тих, хто перейшов на "індекси". Звичайно, граматику програвали гітлерівці. Ось як бритва Occam усуває непотрібні деталі, якщо вся справа залишається актуальною досить довго.

Тож давайте полегшимо - знання різниці між рядками та записами абсолютно нічого не дає нашій здатності розробляти та підтримувати бази даних. Багато чудових професіоналів використовують рядки та записи взаємозамінно, але розробляють дивовижні системи. Таким чином, бритва Occam повинна врешті-решт усунути розрізнення, і наступному поколінню доведеться дізнатися один менш марний факт. Якщо, звичайно, SQL залишається актуальним на той час.


5

Цитуючи книгу CJ Date "Вступ до систем баз даних" " Рядки такої таблиці можна вважати записами файлу ... "

Отже, для баз даних це Row.


4

Коротка відповідь :

  • Запис - це частина збережених (або зібраних) даних.
  • Рядок - це запис, що зберігається лінійно.
  • Коли це можливо, використовуйте більш конкретний термін.

Примітка: таблиці зберігають записи лінійно, а запити повертають результати лінійно

Підтримка :

Додаткові визначення з усієї мережі:

  • SQL "рядок" ( 1 , 2 )
  • "Запис" SQL ( 1 , 2 )
  • "запис" ( 1 , 2 , 3 , 4 )
  • "рядок" ( 1 , див. також 2 , 3 , 4 )
  • Рядок проти запису на StackOverflow ( 1 , 2 )

Примітно, що визначення SQL зазвичай відповідають англійському визначенню.

Якщо у вас є визначення, яке, на вашу думку, має бути тут, будь ласка, додайте його до коментарів.
Мене особливо цікавлять визначення зі стандарту SQL або документація реалізації.

Цитата підведена "Рядки - це не записи". Якщо вийти з контексту, це, здається, суперечить моїм попереднім твердженням (і твердженням багатьох фахівців із бази даних). Але, якщо ви прочитаєте цілий пост ( 1 пошук цитати) Джо Селко (він же - CELKO--), стане зрозуміло, що Джо Селко намагається виправити помилкове уявлення про людину, яка, як вважає, Джо Селко, виникає в результаті " ... фон в обробці даних за допомогою традиційних файлових систем ... ". Якщо коротко, Джо Селко говорить, що рядки SQL працюють не так, як записи в інших системах. Джо Селко не претендує на право / привілей визначати термін, він намагається усунути непорозуміння, спричинене неправильним застосуванням принципів однієї моделі зберігання до іншої.


3
Я ціную роботу і подумав, що ви вкладете це в цю справу. Зазначу, що диференціація Селко призначена для виявлення відмінностей між RDBMS та системою плоских файлів-COBOL, що передували RDBMS. Ерго, він підкреслює "рядок" як частину схеми RDBMS та "запис" як складову частину плоского файлу.
swasheck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.