Каково ваше соглашение об именах для хранимых процедур?
Я видел различные правила для именования хранимых процедур.
Некоторые люди префиксное имя sproc с помощью usp_, другие - с аббревиатурой имени приложения, а третьи - с именем владельца. Вы не должны использовать sp_ в SQL Server, если не имеете в виду это.
Некоторые начинают имя proc с помощью глагола (Get, Add, Save, Remove). Другие подчеркивают имя (имена) объекта.
В базе данных с сотнями sprocs может быть очень сложно прокрутить и найти подходящий sproc, если вы думаете, что он уже существует. Соглашения об именах могут облегчить поиск sproc.
Используете ли вы соглашение об именах? Пожалуйста, опишите это и объясните, почему вы предпочитаете его по сравнению с другими вариантами.
Резюме ответов:
- Кажется, что каждый защищает согласованность именования, что для каждого может быть более важным использовать одно и то же соглашение об именах, чем тот, который используется.
- Префиксы: В то время как многие люди используют usp_ или что-то подобное (но редко sp_), многие другие используют имя базы данных или приложения. Один умный DBA использует gen, rpt и tsk, чтобы отличать общие CRRO sprocs от тех, которые используются для отчетов или задач.
- Verb + Noun кажется немного более популярным, чем Noun + Verb. Некоторые используют ключевые слова SQL (Select, Insert, Update, Delete) для глаголов, в то время как другие используют не-SQL-глаголы (или аббревиатуры для них), такие как Get и Add. Некоторые различают singluar и множественные существительные, чтобы указать, извлекается ли одна или несколько записей.
- В конце, где это необходимо, предлагается дополнительная фраза. GetCustomerById, GetCustomerBySaleDate.
- Некоторые люди используют подчеркивания между сегментами имен, а некоторые избегают подчеркивания. app_ Get_Customer vs. appGetCustomer - я думаю, это вопрос читаемости.
- Большие коллекции sprocs могут быть разделены на пакеты Oracle или решения и проекты Studio Studio (SQL Server) или схемы SQL Server.
- Следует избегать непроницаемых сокращений.
Почему я выбираю ответ, который я сделал: Есть много хороших ответов. Спасибо вам всем! Как вы можете видеть, было бы очень сложно выбрать один. Тот, который я выбрал, резонировал со мной. Я пошел по тому же пути, который он описывает, пытаясь использовать Verb + Noun, а затем не в состоянии найти все sprocs, которые применяются к клиенту.
Возможность найти существующий sproc или определить, существует ли он даже, очень важна. Серьезные проблемы могут возникнуть, если кто-то непреднамеренно создает дубликат sproc с другим именем.
Так как я обычно работаю над очень большими приложениями с сотнями sprocs, я предпочитаю самый простой способ определения имен. Для небольшого приложения я могу отстаивать Verb + Noun, поскольку это следует за общим соглашением кодирования для имен методов.
Он также выступает за префикс с именем приложения вместо не очень полезного usp_. Как отмечалось несколькими людьми, иногда база данных содержит sprocs для нескольких приложений. Таким образом, префикс с именем приложения помогает сегрегировать sprocs и помогает администраторам баз данных и другим пользователям определять, в каком приложении используется sproc.
Ответы
Ответ 1
Для моего последнего проекта я использовал usp_ [Action] [Object] [Process], например, usp_AddProduct или usp_GetProductList, usp_GetProductDetail. Однако теперь база данных составляет 700 процедур плюс, становится намного сложнее найти все процедуры для определенного объекта. Например, теперь мне нужно искать 50 нечетных процедур добавления для добавления продукта и 50 нечетных для Get и т.д.
Из-за этого в моем новом приложении я планирую группировать имена процедур по объекту, я также отбрасываю usp, поскольку я чувствую, что он несколько избыточен, кроме как сказать мне свою процедуру, что я могу вычесть из имя самой процедуры.
Новый формат выглядит следующим образом
[App]_[Object]_[Action][Process]
App_Tags_AddTag
App_Tags_AddTagRelations
App_Product_Add
App_Product_GetList
App_Product_GetSingle
Это помогает группировать вещи для более легкого поиска позже, особенно если есть большое количество sprocs.
Относительно того, где используется более одного объекта, я обнаружил, что большинство экземпляров имеют первичный и вторичный объекты, поэтому основной объект используется в обычном экземпляре, а вторичный - в разделе процесса, например App_Product_AddAttribute.
Ответ 2
Вот некоторые пояснения к проблеме спрей sp_ в SQL Server.
Хранимые процедуры, названные с префиксом sp_, являются системными sprocs, хранящимися в базе данных Master.
Если вы даете вашему sproc этот префикс, SQL Server сначала ищет их в базе данных Master, а затем базу данных контекста, тем самым излишне тратя ресурсы. И если созданный пользователем sproc имеет то же имя, что и система sproc, созданный пользователем sproc не будет выполнен.
Префикс sp_ указывает, что sproc доступен из всех баз данных, но он должен выполняться в контексте текущей базы данных.
Вот приятное объяснение, которое включает в себя демонстрацию производительности.
Вот еще один полезный источник, предоставленный Ant в комментарии.
Ответ 3
Системы венгерский (как и предыдущий префикс "usp" ) заставляет меня дрожать.
Мы совместно используем многие хранимые процедуры в разных, аналогично структурированных базах данных, поэтому для конкретных баз данных мы используем префикс самого имени базы данных; общие процедуры не имеют префикса. Я полагаю, что использование разных схем может быть альтернативой вообще избавиться от таких уродливых префиксов.
Фактическое имя после префикса сильно отличается от имени функции: обычно это глагол типа "Добавить", "Установить", "Создать", "Рассчитать", "Удалить" и т.д., за которым следуют несколько более конкретных существительных, таких как как "Пользователь", "DailyRevenues" и т.д.
Ответ на Ant комментарий:
- Разница между таблицей и представлением актуальна для тех, кто разрабатывает схему базы данных, а не тех, кто имеет доступ или изменяет ее содержимое. В редких случаях, когда требуется спецификация схемы, ее достаточно легко найти. Для случайного запроса SELECT это не имеет значения. Фактически, я рассматриваю возможность рассматривать таблицы и представления так же, как большое преимущество.
- В отличие от функций и хранимых процедур, имя таблицы или представления вряд ли начнется с глагола или будет состоять из одного или нескольких существительных.
- Функция требует, чтобы префикс схемы вызывался. Фактически, синтаксис вызова (который мы используем в любом случае) очень отличается между функцией и хранимой процедурой. Но даже если бы это было не так, то же, что и 1. применимо: если я могу рассматривать функции и хранимые процедуры одинаково, почему бы мне не делать этого?
Ответ 4
Запуск имени хранимой процедуры с sp_
является плохим в SQL Server, потому что система запускает все с sp_. Согласованное присвоение имен (даже в пределах hobgoblin-dom) полезно, поскольку оно облегчает автоматизированные задачи на основе словаря данных. Префиксы немного менее полезны в SQL Server 2005, поскольку он поддерживает схемы, которые могут использоваться для различных типов пространств имен таким образом, который префиксы для используемых имен. Например, в схеме звездочек можно было иметь схемы сглаживания и фактов и ссылаться на таблицы по этому соглашению.
Для хранимых процедур префикс полезен с целью отсканирования прикладных sprocs от системных sprocs. up_
vs. sp_
позволяет относительно легко идентифицировать несистемные хранимые процедуры из словаря данных.
Ответ 5
TableName_WhatItDoes
Нет префиксов или глупых венгерских глупостей. Просто имя таблицы, с которой она наиболее тесно связана, и краткое описание того, что она делает.
Остерегайтесь вышеизложенного: я лично всегда префишу весь мой автогенерированный CRUD с помощью zCRUD_, чтобы он сортировался до конца списка, где мне не нужно смотреть на него.
Ответ 6
На протяжении многих лет я использовал почти все различные системы. Я наконец разработал этот, который я продолжаю использовать сегодня:
Префикс:
- gen - Общее: CRUD, в основном
- rpt - Отчет: самоочевидный
- tsk - Задача: обычно что-то с процедурной логикой, выполняется через запланированные задания
Спецификатор действия:
Ins - INSERT
Sel - SELECT
Upd - UPDATE
Del - DELETE
(В тех случаях, когда процедура делает много вещей, общая цель используется для выбора спецификатора действия. Например, клиент INSERT может потребовать много подготовительной работы, но общая цель - INSERT, поэтому "Ins".
Объект:
Для gen (CRUD) это влияет на имя таблицы или вида. Для rpt (Report) это краткое описание отчета. Для tsk (Task) это краткое описание задачи.
Дополнительные расширители:
Это дополнительные биты информации, используемые для улучшения понимания процедуры. Примеры включают "By", "For" и т.д.
Формат:
[Префикс] [Action Specifier] [Entity] [Дополнительные расширители]
Примеры имен процедур:
genInsOrderHeader
genSelCustomerByCustomerID
genSelCustomersBySaleDate
genUpdCommentText
genDelOrderDetailLine
rptSelCustomersByState
rptSelPaymentsByYear
tskQueueAccountsForCollection
Ответ 7
Я всегда инкапсулирую хранимые процедуры в пакеты (я использую Oracle, на работе). Это уменьшит количество отдельных объектов и повторное использование кода справки.
Соглашение об именах - это вопрос вкуса и того, что вы должны согласовать со всеми другими разработчиками при запуске проекта.
Ответ 8
для небольших баз данных, я использую uspTableNameOperationName, например. uspCustomerCreate, uspCustomerDelete и т.д. Это облегчает группировку по "основной" сущности.
для больших баз данных добавьте имя схемы или подсистемы, например. Получение, покупка и т.д., Чтобы их группировать (поскольку сервер sql любит отображать их в алфавитном порядке)
Я стараюсь избегать сокращений в именах, для ясности (и новым людям в проекте не нужно задаваться вопросом, что означает "UNAICFE", потому что sproc называется uspUsingNoAbbreviationsIncreasesClarityForEveryone)
Ответ 9
В настоящее время я использую формат, похожий на следующий
Обозначения:
[PREFIX] [ПРИМЕНЕНИЕ] [МОДУЛЬ] _ [ИМЯ]
Пример:
P_CMS_USER_UserInfoGet
Мне нравятся эти обозначения по нескольким причинам:
- начиная с очень простого префикса позволяет писать код для выполнения только объектов, начинающих с префикса (например, для сокращения SQL-инъекции)
- в нашей более крупной среде несколько команд работают над различными приложениями, которые используют одну и ту же архитектуру базы данных. Обозначение приложения обозначает, какая группа принадлежит SP.
- Секции Module и Name просто завершают иерархию. Все имена должны быть сопоставлены с Группой/Приложением, Модулем, Функция из иерархии.
Ответ 10
Я всегда использую:
usp [Имя таблицы] [Действие] [Дополнительные сведения]
Учитывая таблицу под названием "tblUser", это дает мне:
- uspUserCreate
- uspUserSelect
- uspUserSelectByNetworkID
Процедуры сортируются по алфавиту по имени таблицы и по функциональности, поэтому легко увидеть, что я могу сделать для любой таблицы. Использование префикса "usp" позволяет мне узнать, что я вызываю, если я (например) пишу 1000-строчную процедуру, которая взаимодействует с другими процедурами, несколькими таблицами, функциями, представлениями и серверами.
До тех пор, пока редактор в IDE SQL Server не будет таким же хорошим, как Visual Studio, я сохраняю префиксы.
Ответ 11
префикс приложения префикс_ описание объектов базы данных (за вычетом пробелов между символами подчеркивания) пришлось помещать пробелы для отображения).
Операционные префиксы, которые мы используем -
- "get" - возвращает набор записей
- "ins" - вставляет данные
- "upd" - обновляет данные
- "del" - удаляет данные
например
wmt_ ins _ customer _details
"инструмент управления рабочей силой, вставьте детали в таблицу клиентов"
<сильные > преимущества
Все хранимые процедуры, относящиеся к одному и тому же приложению, группируются вместе по имени. Внутри группы хранимые процедуры, которые выполняют один и тот же тип операции (например, вставки, обновления и т.д.), Группируются вместе.
Эта система работает хорошо для нас, прибл. 1000 хранимых процедур в одной базе данных с верхней части головы.
Пока не сталкивались с какими-либо недостатками этого подхода.
Ответ 12
GetXXX - Получает XXX на основе @ID
GetAllXXX - Получает все XXX
PutXXX - Вставляет XXX, если он принят @ID равен -1; Другие обновления
DelXXX - удаляет XXX на основе @ID
Ответ 13
Я думаю, что соглашение об именах usp_ ничего не делает.
В прошлом я использовал префиксы Get/Update/Insert/Delete для CRUD-операций, но теперь, поскольку я использую Linq для SQL или EF для выполнения большинства моих работ CRUD, они полностью исчезли. Поскольку у меня так мало хранимых процессов в моих новых приложениях, соглашения об именах больше не имеют значения, как раньше: -)
Ответ 14
Для текущего приложения, над которым я работаю, у нас есть префикс, который идентифицирует имя приложения (четыре строчные буквы). Причина этого в том, что наше приложение должно быть в состоянии сосуществовать с устаревшим приложением в одной и той же базе данных, поэтому префикс является обязательным.
Если у нас не было устаревшего ограничения, я вполне уверен, что мы не будем использовать префикс.
После префикса мы обычно запускаем имя SP с помощью глагола, который описывает, что делает процедура, а затем имя объекта, над которым мы работаем. Плурализация имени объекта разрешена. Мы стараемся подчеркнуть читаемость, так что очевидно, что процедура делает только с именем.
Типичные имена хранимых процедур в нашей команде:
shopGetCategories
shopUpdateItem
Ответ 15
Я не думаю, что это действительно важно, что ваш префикс настолько длинный, насколько вы логичны и последовательны. Лично я использую
spu_ [описание действия] [описание процесса]
где описание действия является одним из небольшого диапазона типичных действий, таких как get, set, archive, insert, delete и т.д. Описание процесса является чем-то коротким, но описательным, например
spu_archiveCollectionData
или
spu_setAwardStatus
Я называю свои функции аналогичным образом, но префикс с udf _
Я видел, как люди пытались использовать псевдо-венгерскую нотацию для именования процедур, которая, на мой взгляд, скрывает больше, чем она показывает. До тех пор, пока я перечисляю свои процедуры в алфавитном порядке, я могу видеть их сгруппированными по функциональности, а для меня это кажется сладким пятном между порядком и ненужной строгостью.
Ответ 16
Избегайте sp_ * в SQl-сервере, все системные сохраненные prcedures начинаются с sp_, и поэтому система становится более сложной для поиска объекта, соответствующего имени.
Итак, если вы начнете с чего-то другого, кроме sp_, станет легче.
Итак, для начала мы используем общее имя Proc_. Это упрощает идентификацию процедур, если они представлены одним большим файлом схемы.
Кроме того, мы назначаем префикс, который идентифицирует функцию. Как
Proc_Poll_Interface, Proc_Inv_Interface
и т.д.
Это позволяет нам находить все сохраненные procs, которые выполняют работу POLL vs, которая делает Inventory и т.д.
В любом случае система префикса зависит от вашего проблемного домена. Но он сказал и сделал что-то подобное, должно присутствовать, даже если это просто, чтобы позволить людям быстро найти хранимую процедуру в раскрывающемся списке для редактирования.
другой, например, функции.
Proc_Order_Place
Proc_order_Delete
Proc_Order_Retrieve
Proc_Order_History
Мы следовали основанной на функциях именованиям coz. Procs сродни коду/функции, а не статическим объектам, таким как таблицы. Это не помогает тому, что Procs может работать с несколькими таблицами.
Если proc выполнил больше функций, чем может обрабатываться одним именем, это означает, что ваш proc делает намного больше, чем необходимо, и время его разделить снова.
Надеюсь, что это поможет.
Ответ 17
Я присоединился к концу потока, но я хочу ввести свой ответ здесь:
В моих последних двух проектах есть разные тенденции, например, в одном из них:
Получить данные: s <tablename> _G
Чтобы удалить данные: s <tablename> _D
Вставить данные: s <tablename> _I
Чтобы обновить данные: s <tablename> _U
Эти соглашения об именах также выполняются в интерфейсе, префиксное слово dt.
Пример:
exec sMedicationInfo_G
exec sMedicationInfo_D
exec sMedicationInfo_I
exec sMedicationInfo_U
С помощью вышеуказанных соглашений об именах в нашем приложении у нас есть хорошие и легко запоминаемые имена.
Во втором проекте мы использовали одни и те же соглашения об именах с разницей в lill:
Получить данные: sp_ <tablename> G
Для удаления данных: sp_ <tablename> D
Чтобы вставить данные: sp_ <tablename> я
Чтобы обновить данные: sp_ <tablename> U
Пример:
exec sp_MedicationInfoG
exec sp_MedicationInfoD
exec sp_MedicationInfoI
exec sp_MedicationInfoU