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 的命名约定是什么?