我已经看到了命名存储过程的各种规则.
有些人使用usp_作为sproc名称的前缀,其他人使用应用程序名称的缩写作为前缀,还有其他人使用所有者名称.您不应该在SQL Server中使用sp_,除非您真正的意思.
有些人用动词(Get,Add,Save,Remove)启动proc名称.其他人则强调实体名称.
在具有数百个sprocs的数据库中,当您认为已存在时,可能很难滚动并找到合适的sproc.命名约定可以使定位sproc更容易.
你使用命名约定吗?请描述一下,并解释为什么你喜欢它而不是其他选择.
答复摘要:
每个人似乎都提倡命名的一致性,对于每个人来说,使用与使用特定命名约定相同的命名约定可能更为重要.
前缀:虽然很多人使用usp_或类似的东西(但很少sp_),但许多其他人使用数据库或应用程序名称.一个聪明的DBA使用gen,rpt和tsk来区分一般的CRUD sprocs和用于报告或任务的那些.
动词+名词似乎比Noun + Verb稍微受欢迎.有些人对动词使用SQL关键字(选择,插入,更新,删除),而其他人则使用非SQL动词(或缩写),如Get和Add.有些人区分单数和复数名词,以表明是否正在检索一个或多个记录.
在适当的情况下,最后建议使用另一个短语.GetCustomerById,GetCustomerBySaleDate.
有些人在名称段之间使用下划线,有些人则避免使用下划线.app_ Get_Customer与appGetCustomer - 我想这是一个可读性的问题.
可以将大量的sprocs分隔为Oracle包或Management Studio(SQL Server)解决方案和项目,或SQL Server模式.
应该避免使用不可思议的缩写.
为什么我选择我做的答案:有很多好的回答.谢谢你们!如你所见,选择一个是非常困难的.我选择的那个与我产生共鸣.我遵循他描述的相同路径 - 尝试使用Verb + Noun然后无法找到适用于Customer的所有sprocs.
能够定位现有的sproc,或确定是否存在,甚至是非常重要的.如果有人无意中创建了具有其他名称的重复sproc,则可能会出现严重问题.
由于我通常使用包含数百个sprocs的非常大的应用程序,因此我倾向于使用最容易找到的命名方法.对于较小的应用程序,我可能会提倡Verb + Noun,因为它遵循方法名称的一般编码约定.
他还提倡使用app name作为前缀,而不是使用不太有用的usp_.有几个人指出,有时数据库包含多个应用程序的sprocs.因此,使用app name前缀有助于隔离sprocs并帮助DBA和其他人确定sproc用于哪个应用程序.
对于我的上一个项目,我使用了usp_ [Action] [Object] [Process],例如usp_AddProduct或usp_GetProductList,usp_GetProductDetail.但是现在数据库处于700个程序加上,在特定对象上找到所有程序变得更加困难.例如,我现在必须为产品添加搜索50个奇数的添加过程,为Get等搜索50个奇数.
因为在我的新应用程序中我正在计划按对象分组过程名称,我也放弃了usp,因为我觉得它有些多余,除了告诉我它的程序,我可以从名称中扣除程序本身.
新格式如下
[App]_[Object]_[Action][Process] App_Tags_AddTag App_Tags_AddTagRelations App_Product_Add App_Product_GetList App_Product_GetSingle
它有助于将事物分组以便以后更容易找到,特别是如果存在大量的sprocs.
关于使用多个对象的位置,我发现大多数实例都有主要和次要对象,因此主要对象在普通实例中使用,而次要在引用部分中引用,例如App_Product_AddAttribute.
以下是有关SQL Server中sp_前缀问题的一些说明.
以前缀sp_命名的存储过程是存储在主数据库中的系统存储过程.
如果你给你的sproc这个前缀,SQL Server首先在Master数据库中查找它们,然后在上下文数据库中查找它们,从而不必要地浪费资源.并且,如果用户创建的sproc与系统sproc具有相同的名称,则不会执行用户创建的sproc.
sp_前缀表示可以从所有数据库访问sproc,但它应该在当前数据库的上下文中执行.
这是一个很好的解释,其中包括性能影响的演示.
这是 Ant在评论中提供的另一个有用的来源.
系统匈牙利语(如上面的"usp"前缀)让我不寒而栗.
我们在不同的,结构相似的数据库之间共享许多存储过程,因此对于特定于数据库的数据库,我们使用数据库名称本身的前缀; 共享程序没有前缀.我想使用不同的模式可能是完全摆脱这些有点丑陋的前缀的替代方案.
前缀后面的实际名称与函数命名几乎没有区别:通常是"添加","设置","生成","计算","删除"等动词,后跟几个更具体的名词,如"用户" ","DailyRevenues",等等.
回应Ant的评论:
表和视图之间的区别与设计数据库模式的人有关,而不是访问或修改其内容的人.在极少数需要模式细节的情况下,很容易找到.对于随意的SELECT查询,它是无关紧要的.事实上,我认为能够将表格和观点视为一个很大的优势.
与函数和存储过程不同,表或视图的名称不太可能以动词开头,或者只是一个或多个名词.
函数需要调用模式前缀.事实上,函数和存储过程之间的调用语法(无论如何我们都使用)是非常不同的.但即使它不是,也适用1.如果我可以对待函数和存储过程相同,为什么我不应该?
sp_
在SQL Server中启动存储过程名称是错误的,因为系统sprocs都以sp_开头.一致的命名(甚至在hobgoblin-dom范围内)是有用的,因为它可以根据数据字典促进自动化任务.前缀在SQL Server 2005中稍微不那么有用,因为它支持模式,模式可以用于以前的名称前缀的方式用于各种类型的命名空间.例如,在星型模式中,可以使用dim和fact模式,并通过此约定引用表.
对于存储过程,前缀对于从系统sprocs中识别应用程序sprocs非常有用. up_
vs sp_
使得从数据字典中识别非系统存储过程相对容易.
多年来,我使用了几乎所有不同的系统.我终于开发了这个,我今天继续使用它:
字首 :
gen - General:CRUD,主要是
rpt - 报告:不言自明
tsk - 任务:通常是程序逻辑的东西,通过预定的工作运行
动作说明:
Ins - INSERT Sel - SELECT Upd - UPDATE Del - DELETE
(如果程序执行很多操作,则总体目标用于选择操作说明符.例如,客户INSERT可能需要大量的准备工作,但总体目标是INSERT,因此选择"Ins".
宾语:
对于gen(CRUD),这是受影响的表或视图名称.对于rpt(报告),这是报告的简短描述.对于tsk(任务),这是任务的简短描述.
可选的澄清剂:
这些是用于增强对过程的理解的可选信息部分.例子包括"By","For"等.
格式:
[前缀] [动作说明] [实体] [可选镜头]
程序名称的示例:
genInsOrderHeader genSelCustomerByCustomerID genSelCustomersBySaleDate genUpdCommentText genDelOrderDetailLine rptSelCustomersByState rptSelPaymentsByYear tskQueueAccountsForCollection
TableName_WhatItDoes
Comment_GetByID
CUSTOMER_LIST
UserPreference_DeleteByUserID
没有前缀或愚蠢的匈牙利废话.只是与其关系最密切的表格的名称,以及它的作用的快速描述.
对上述内容的一个警告:我个人总是将所有自动生成的CRUD作为zCRUD_的前缀,以便它排序到列表的末尾,我不必查看它.