TVP 中使用的表类型是否有最佳实践或策略?例如,给定以下内容:
CREATE TABLE dbo.Colors (
Id int identity PRIMARY KEY,
Name nvarchar(100),
);
CREATE TABLE dbo.Shapes (
Id int identity PRIMARY KEY,
Name nvarchar(100),
);
CREATE TABLE dbo.Materials (
Id int identity PRIMARY KEY,
Name nvarchar(100),
);
CREATE TABLE dbo.Items (
Id int identity PRIMARY KEY,
Name nvarchar(100),
ColorId int FOREIGN KEY REFERENCES dbo.Colors (ID),
ShapeId int FOREIGN KEY REFERENCES dbo.Shapes (ID),
MaterialId int FOREIGN KEY REFERENCES dbo.Materials (ID),
);
如果您实现了一个存储过程来搜索需要支持通过 TVP 选择多种颜色、多种形状和多种材料的项目(想想 UI 中的复选框列表),您会创建三种单独的表类型,一种用于每个 TVP,还是您会创建一个类型以在所有三个中使用它?
换句话说,这:
CREATE TYPE dbo.ColorIds AS TABLE (Id int);
CREATE TYPE dbo.ShapeIds AS TABLE (Id int);
CREATE TYPE dbo.MaterialIds AS TABLE (Id int);
GO
CREATE PROCEDURE dbo.SearchItems
@ColorIds ColorIds READONLY,
@ShapeIds ShapeIds READONLY,
@MaterialIds MaterialIds READONLY
AS
BEGIN
PRINT 'Do something here'
END
GO
与此相对:
CREATE TYPE dbo.Ids AS TABLE (Id int);
GO
CREATE PROCEDURE dbo.SearchItems
@ColorIds Ids READONLY,
@ShapeIds Ids READONLY,
@MaterialIds Ids READONLY
AS
BEGIN
PRINT 'Do something here'
END
GO
样本是故意设计的;真正的用例包括更多的表,虽然有不同的列,但都有一个ID int
主键。因此,我个人更倾向于后者。它的开销要少得多,但我很想知道这样做是否有任何缺点我应该注意。这当然仅适用于 TVP 和 TVP (我永远不会在真实表或任何其他更永久性的结构中混合不同的实体。)
在此期间,您命名表类型和 TVP 的命名约定是什么?
我个人在我的系统中使用后者,更通用的版本。我有两个表格,我可以立即想到:
UniqueIntegerTable
并且UniqueStringTable
- 如您所想,它们的定义如下:我更喜欢使用通用的 TVP,这样我就不会用基本相同的多种类型来阻塞我的架构。性能与您在第一个示例中定义显式类型完全相同,它的好处是它为我创建了更少的代码来维护。
我知道我之前听到的关于使用绑定到表的显式类型的一个论点是更容易理解它们的用法。我个人不同意这一点。没有什么能阻止我使用错误的类型定义存储过程(但具有满足我需要的正确形状)。相反,我可以给变量一个好名字来推断用法和表的内容:
在命名约定方面,我不知道任何官方标准,但我使用的是附加
Table
到类型名称的末尾。我知道这与使用前缀并没有什么不同,tbl
但在这种情况下我可以接受。与所有命名约定一样,选择一个您认为易于使用的命名约定——但一旦您这样做了,就坚持下去。命名约定只有在您保持一致时才有用。