2009-08-06 223 views
2

我开始一个新的项目,而我在我的SQL Server 2005数据库中使用别名数据类型,常见的表列考虑。对于例如我将定义的别名的数据类型以保持对象的名称,如下所示:SQL别名数据类型

CREATE TYPE adt_Name FROM VARCHAR(100)不为空

然后将其用于表的列的定义,确保我所有的列共享完全相同的定义(长度,可空性,精度等)。

  1. 使用别名数据类型的优点是什么?
  2. 使用别名数据类型的缺点是什么?
  3. 你会推荐什么样的命名约定?我在想adt_Xxx(adt =别名数据类型)。
  4. 为什么SQL Server 2005 Management Studio不允许我使用来自GUI的别名数据类型。我只能通过SQL脚本使用它们。 GUI不会在任何下拉框中列出它们 - 令人沮丧。
  5. 别名数据类型的使用会如何影响我的Linq to SQL模型?

回答

6

优点:

  • 可重复使用和可共享的ADT是它的创建中,如果你想在您的所有数据块,然后在模型数据库中创建它的数据库中可重复使用的

  • 执行,该ADT将执行它的基本类型的特征,长度和为空,并且可以用于执行开发标准

  • 隐组合不允许共nversions,抽象数据类型不能转换或转换

  • 简单,与其它语言的ADT借给简单性开发和维护

  • 数据隐藏

缺点:

  • 不可修改,ADT不能直接修改,您必须删除并重新创建EM。请注意,您仍然可以将它们所在的表更改为另一个基本类型或ADT,然后删除并重新创建它们,然后将表更改回来(或者只是创建一个新表来更改它们)。

  • 没有工具,ADT的必须与使用CREATE语句直接查询创建(sp_addtype已被弃用,不应该使用)。

  • 表变量不支持

命名规则:

  • 'adt_' 看起来像它会工作得很好

LINQ到SQL:

  • 将这些类型作为基础输入您的querys,或创建相应的类型使用
1

类型一般都很好,但我们的项目使用它有限,所以我可以回答#2 问题是“改变”。我们开发了类型为varchar(255)的TUrl,但过了一段时间我们试图改变为varchar(800)。对于工作数据库是不可能的。

我不知道使用别名数据类型的任何其他缺点。

6

我会建议反对。我支持一些拥有使用它们的产品的客户,他们是一个持续的PITA(脚踝疼痛)。

尤其是,您不能在#temp表中使用它们,除非您在TempDB中定义它们。由于每次重新启动SQL Server时都会重置TempDB,这意味着每次重新启动SQL Server时都必须重新定义它们。但这意味着一个启动程序,必须在主人,并有一定的特权。而且,由于别名定义(真的是女士术语中的UDT)可能会改变,这意味着DBA必须授予其他人权限来编辑该过程,这可能是一个安全问题。

呵呵,为了避免我忘了,如果您必须升级,迁移或重新安装服务器,您需要将此proc的外部副本重新添加到Master,您需要记住这样做。

然后有一些限制:根据我的经验,开发人员想要使用这些“别名”,因为他们认为如果他们需要,他们可以灵活地改变定义。它不会。持久性数据不像持久性代码,它没有这种灵活性,SQL Server在这里根本不会帮你什么忙。在你尝试完成一次之后,你很快就会得出结论,你从来不应该使用这些东西。

1

IMO使用内置的类型是颈部巨大的痛苦。其他人已经给出了足够的理由。我正在使用C风格的宏。举例来说,在我的SQL 2000的代码,我在一个单独的文件macros.h以下行

#define WIDEST_CHAR VARCHAR(8000) 

如下,我会用它:

#include "macros.h" 

(snip) 

CREATE TABLE dbo.Comments(CommentID INT NOT NULL, 
Comment WIDEST_CHAR, 
... 

和宏WIDEST_CHAR将VARCHAR被替换(8000)由预处理器。当我迁移我的系统到2005年,我简单地更换宏定义与

#define WIDEST_CHAR VARCHAR(MAX) 

和我所有的设置。