Database design 创建db用户定义的数据类型是最佳实践吗?

Database design 创建db用户定义的数据类型是最佳实践吗?,database-design,user-defined-types,Database Design,User Defined Types,创建用户定义的类型而不是使用现有类型是最佳实践吗?在我的预览工作区中,所有基本类型都是预定义的,这是最佳实践吗?它有什么优点和缺点。非常感谢 就个人而言,我不使用它们,但我见过它们。一个问题是客户端代码至少只能识别MS SQL Server的基类型IIRC。以及跨版本的可移植性/行为。 就个人而言,我不使用它们,但我见过它们。一个问题是客户端代码至少只能识别MS SQL Server的基类型IIRC。以及跨版本的可移植性/行为。在MS SQL Server中-这个想法非常棒。但是,它们有一个很

创建用户定义的类型而不是使用现有类型是最佳实践吗?在我的预览工作区中,所有基本类型都是预定义的,这是最佳实践吗?它有什么优点和缺点。
非常感谢

就个人而言,我不使用它们,但我见过它们。一个问题是客户端代码至少只能识别MS SQL Server的基类型IIRC。以及跨版本的可移植性/行为。


就个人而言,我不使用它们,但我见过它们。一个问题是客户端代码至少只能识别MS SQL Server的基类型IIRC。以及跨版本的可移植性/行为。

在MS SQL Server中-这个想法非常棒。但是,它们有一个很大的但是语句:一旦它们被使用,您就不能更改它们,因为没有
ALTER TYPE….
语句。这可能是一个大麻烦

考虑一下:你有一个书店应用程序,它有一个用户定义的类型ISBN=VARCHAR(10)——工作起来很有魅力。现在,国际委员会决定将ISBN字段增加到13个字符-不幸的是,没有
改变ISBNType类型….
,因此您唯一的选择是基本上删除所有数据库中该类型的所有列,然后以新的形式重新创建该类型,然后重新创建所有这些列

这个想法很好,我很想使用它——但在目前的状态下,它几乎无法使用,在我看来,这是不幸的


mssqlserver中的Marc

——这个想法很好。但是,它们有一个很大的但是语句:一旦它们被使用,您就不能更改它们,因为没有
ALTER TYPE….
语句。这可能是一个大麻烦

考虑一下:你有一个书店应用程序,它有一个用户定义的类型ISBN=VARCHAR(10)——工作起来很有魅力。现在,国际委员会决定将ISBN字段增加到13个字符-不幸的是,没有
改变ISBNType类型….
,因此您唯一的选择是基本上删除所有数据库中该类型的所有列,然后以新的形式重新创建该类型,然后重新创建所有这些列

这个想法很好,我很想使用它——但在目前的状态下,它几乎无法使用,在我看来,这是不幸的


马克有点晚了,但是。。我的两次旅行

用户定义的类型在概念模型和逻辑模型中扮演域的角色,因此,如果您希望在物理数据库中实现逻辑数据模型,则使用用户定义的类型将是最接近的近似方法。这将提供一些好处,例如使用可以自动转移到实现的图形模型,比不使用UDT的情况下更好

使用域可以检测将邮政编码存储在SSN字段中的尝试,并在运行时(甚至编译时)让数据库捕获它们。这将使您能够在应该强制执行的位置强制执行公司范围的业务规则:在数据到达存储的位置。其他任何地方都是对用户的礼貌,但这是绝对必须强制执行的地方,以确保没有人绕过它们

此外,ANSI SQL:1999中定义的UDT封装了方法,并且可以是子类型。这意味着处理约束的业务规则中的某些更改可以在数据库中更改,而无需接触实现

然而。。。目前实施的UDT还有很多需要改进的地方。我甚至不确定SQLServer是否实现了上述标准,更不确定Oracle是否实现了上述标准。即使他们这样做了,当你使用BI工具、ETL工具或其他相当简单的工具时,使用UDT的缺点也会很明显:他们通常不理解UDT,即使理解,他们也无法使用UDT,因为大多数UDT都基于基本类型(int、char和date/time)

关于报表工具,让我们考虑一个具有字段组合的UDT。现在,与数据库无关的ETL工具如何能够理解该类型?它必须能够理解结构,以便显示它,或者使用它进行计算。对于每个受支持的数据库来说,这都是一项艰巨的任务。因为没有人使用UDT,所以他们不会这么做。这是一个恶性循环,但我们仍然必须接受它

除此之外,大多数数据库中的UDT支持也不是那么热门。改变类型可能相当困难。虽然语法在任何地方都应该相同,但它们的管理在SQL:1999中没有定义,因此在任何地方都不同。例如,请尝试在sql server中更改UDT的所有者。这曾经是相当困难的-不确定SQL Server 2016,但鉴于UDT看起来不像是一个重点领域,我不期望在这方面有重大改进

最后,如果您将非常复杂的代码添加到UDT中,您会遇到一个老问题,即您在缺乏良好调试选项的环境中编程。那也没用


因此:如果您完全控制数据库,并且所有交互都通过软件进行,UDT将非常有用。如果不是的话,他们可能是一个巨大的痛苦的脖子。在您的场景中,哪一种情况是这样的,只有您才能知道。

有点晚了,但是。。我的两次旅行

用户定义的类型在概念模型和逻辑模型中扮演域的角色,因此,如果您希望在物理数据库中实现逻辑数据模型,则使用用户定义的类型将是最接近的近似方法。这将提供一些好处,例如使用可以自动转移到实现的图形模型,比不使用UDT的情况下更好

使用域可以检测将邮政编码存储在SSN字段中的尝试,并在运行时(甚至编译时)让数据库捕获它们。这将使您能够在应该强制执行的地方强制执行公司范围的业务规则: