Хтось може порекомендувати стандарти кодування для TSQL?


9

У нас давно існують стандарти кодування нашого коду .Net, і, здається, існує кілька поважних джерел для ідей щодо їх застосування, які розвиваються з часом.

Я хотів би мати можливість скласти деякі стандарти для SQL, які написані для використання нашими продуктами, але, здається, немає ніяких ресурсів для досягнення консенсусу для того, що визначає добре написаний SQL?


1
Pinal Dave має на своєму сайті список стандартів кодування . Вони виглядають як справедлива основа для набору стандартів.
Чи буде


1
@Scott, який охоплює лише ідентифікацію; нічого про іменування, використання курсорів / збережених процедур / вибору типу даних або що-небудь, що насправді впливає на якість коду ...
Rowland Shaw

1
саме тому, чому я сказав, що це "пов'язане", а не "дублікат".
Скотт Вітлок

Відповіді:


6

На мій досвід, головне, що я би шукав:

  • Ім'я таблиці та стовпців - подивіться, чи використовуєте ви ідентифікатор, посилання чи номер для стовпців типу ідентифікаторів, однини чи множини для імен (множини, що є загальними для імен таблиць - наприклад, ТОЧКИ, сингулярні для імен стовпців - наприклад, THING_ID). Для мене найважливіші речі - це послідовність, яка дозволяє уникнути того, що люди витрачають час (наприклад, ви не наштовхуєтесь на помилки, коли хтось поставив ТОЩО як назву таблиці, тому що ви просто інтуїтивно знаєте, що назви таблиць ніколи не бувають єдиними).

  • Усі створені файли повинні містити крапку (умовно існуючий об'єкт) як частину їхнього файлу. Ви також можете включити дозволи на отримання гранту.

  • Виділення, оновлення, вставки та видалення повинні бути викладені одним іменем стовпця, одним ім'ям таблиці та одним, де пункт / порядок за пунктом за рядком, щоб вони могли легко коментуватися по одному під час налагодження.

  • Префікс для типів об'єктів, особливо там, де їх можна переплутати (тому v для перегляду є найбільш важливим). Не впевнений, чи він все ще застосовується, але він раніше був неефективним для збережених процедур, крім системних процедур, для початку sp_. Можливо, найкращою практикою їх розмежування все-таки usp_ було те, що я використовував останнім часом.

  • Стандарт, який вказує, як має включати ім'я тригера, чи є оновлення / вставка / видалення та таблиця, до якої воно застосовується. У мене немає переважного стандарту, але це важлива інформація, і його потрібно легко знайти.

  • Стандарт для права власності на об'єкти в більш ранніх версіях SQL Server або схеми, на якій він повинен існувати у 2005 році та пізніших версіях. Це ваш дзвінок, який він є, але ви ніколи не повинні здогадуватися, кому належить щось / де він живе) і, де можливо, схема / власник повинні бути включені до сценаріїв CREATE, щоб мінімізувати можливість його неправильного створення.

  • Показник того, що кожен, хто використовує SELECT *, змусить випити пінту власної сечі.

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

Я впевнений, що я щось пропустив, але для мене це ті, які насправді пропонують реальну користь у пристойній кількості ситуацій.

Але як і у всіх стандартах, менше - більше. Чим довше ваші стандарти кодування, тим менша ймовірність людей їх читати та використовувати. Після того, як ви пройдете пару добре розташованих сторінок, почніть шукати речі, які насправді не роблять практичної різниці в реальному світі, тому що ви просто зменшуєте шанси людей робити щось із цього.

EDIT: два виправлення - включаючи схеми в розділі власності, видалення помилкових підказок щодо підрахунку (*) - див. Коментарі нижче.


1
Якийсь дивний вибір ... "ВИБРАТИ КУХНУ (*)" - це погано? Ви коли-небудь чули про схеми (що не те саме, що власник)? Ваші інші хороші, хоча
gbn

1
@Jon Hopkins - я знаю, чому погано використовувати SELECT *. Було б чудово, якби ви могли сказати, чому використовувати SELECT COUNT (*) погано.
k25

1
@gbn @ k25 - Через кілька років (2002?) у мене був DBA, який дуже сильно розраховував (*), але Гуглінг у відповідь на ваші запитання здається, що це зараз застаріло (якщо це колись було правдою). sqlservercentral.com/articles/Performance+Tuning/adviceoncount/… (Реєстрація потрібна). Вона в першу чергу була OBA Dracle Oracle, тому, можливо, це була справжня проблема, яка, на її думку, була також проблемою для оптимізатора SQL.
Джон Хопкінс

1
@gbn - Так, я маю відносно руки, оскільки вони були представлені, тому моя автоматична реакція була користувачами. Я оновлю відповідь, щоб покрити схеми.
Джон Хопкінс

1
@gbn, @ k25 - Більше копати підрахунок (*). Мабуть, це було проблемою в Oracle 7 і раніше, виправлених у 8i та далі. Не ясно, чи колись це була проблема в SQL Server, але, звичайно, вже не. Моя DBA застаріла, здавалося б.
Джон Хопкінс

3

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

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

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


1
+1. Я думаю, що найважливіше - це ти маєш послідовність серед своєї команди.
Дін Гардінг

1
з інтересу, що б ти робив інакше? Чи багато в чому це питання смаку (компонування тощо) чи є якісь «жорсткі» помилки?
Джон Хопкінс

1
@Jon: жодних важких помилок, просто такі суб'єктивні речі, як назви одинарних таблиць, ненависть до тригерів тощо.
Ларрі Коулмен

1
справедливий приклад (і я його використовую з ІСНУЮЧИМИ і не змушую себе пити сечу)
Джон Хопкінс

1

Окрім відповіді Джона Хопкінса ...

  • Окремі внутрішні та зовнішні об’єкти

    • IX, UQ, TRG, CK тощо для обмежень та індексів тощо
    • нижній регістр або CapsCase для клієнта, наприклад, uspThing_Add
  • Для внутрішніх об'єктів зробіть їх явними, якщо "не за замовчуванням"

    • UQ = унікальне обмеження
    • UQC = унікальне кластерне обмеження
    • ПК = первинний ключ
    • PKN = некластеризований первинний ключ
    • IX = індекс
    • IXU = унікальний індекс
    • IXC = кластерний індекс
    • IXCU або IXUC = унікальний кластерний індекс
  • Використовуйте схеми для спрощення називання + дозволів. Приклади:

    • Helper.xxx для внутрішніх прок
    • HelperFn.xxx для udfs
    • WebGUI.xxx для певного коду
    • Дані та / або Історія та / або Постановка таблиць
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.