为什么要使用 ADO.net Entity Framework 来做听起来像 ETL 的工作?(请参阅下面对 ADO.NET Entity Framework 和 ORM 的一般评论。它是免费的)。
为什么要使用整数?使用唯一标识符将解决“应用程序运行的多个实例”问题。
使用 uniqueidentifier 作为列默认值将比使用 int IDENTITY 慢...生成 guid 比 int 需要更多时间。guid 也将比 int(4 字节)大(16 字节)。首先尝试这个,如果它产生可接受的性能,请运行它。
如果在每一行上生成 guid 所引入的延迟不可接受,请批量(或在另一台服务器上)创建 guid 并将它们缓存在表中。
示例 TSQL 代码:
CREATE TABLE testinsert
(
date_generated datetime NOT NULL DEFAULT GETDATE(),
guid uniqueidentifier NOT NULL,
TheValue nvarchar(255) NULL
)
GO
CREATE TABLE guids
(
guid uniqueidentifier NOT NULL DEFAULT newid(),
used bit NOT NULL DEFAULT 0,
date_generated datetime NOT NULL DEFAULT GETDATE(),
date_used datetime NULL
)
GO
CREATE PROCEDURE GetGuid
@guid uniqueidentifier OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @return int = 0
BEGIN TRY
BEGIN TRANSACTION
SELECT TOP 1 @guid = guid FROM guids WHERE used = 0
IF @guid IS NOT NULL
UPDATE guids
SET
used = 1,
date_used = GETDATE()
WHERE guid = @guid
ELSE
BEGIN
SET @return = -1
PRINT 'GetGuid Error: No Unused guids are available'
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SET @return = ERROR_NUMBER() -- some error occurred
SET @guid = NULL
PRINT 'GetGuid Error: ' + CAST(ERROR_NUMBER() as varchar) + CHAR(13) + CHAR(10) + ERROR_MESSAGE()
ROLLBACK
END CATCH
RETURN @return
END
GO
CREATE PROCEDURE InsertIntoTestInsert
@TheValue nvarchar(255)
AS
BEGIN
SET NOCOUNT ON
DECLARE @return int = 0
DECLARE @guid uniqueidentifier
DECLARE @getguid_return int
EXEC @getguid_return = GetGuid @guid OUTPUT
IF @getguid_return = 0
BEGIN
INSERT INTO testinsert(guid, TheValue) VALUES (@guid, @TheValue)
END
ELSE
SET @return = -1
RETURN @return
END
GO
-- generate the guids
INSERT INTO guids(used) VALUES (0)
INSERT INTO guids(used) VALUES (0)
--Insert data through the stored proc
EXEC InsertIntoTestInsert N'Foo 1'
EXEC InsertIntoTestInsert N'Foo 2'
EXEC InsertIntoTestInsert N'Foo 3' -- will fail, only two guids were created
-- look at the inserted data
SELECT * FROM testinsert
-- look at the guids table
SELECT * FROM guids
有趣的问题是……如何将其映射到 ADO.Net 的实体框架?
这是从 ORM(对象关系映射)早期开始的一个经典问题。
如果您使用关系数据库最佳实践(不允许直接访问基表,只允许通过视图和存储过程进行数据操作),那么您需要添加人员数量(有能力并且愿意编写数据库模式以及所有视图的人)和形成 API 的存储过程)并为项目引入延迟(实际编写这些东西的时间)。
因此,每个人都削减了这一点,人们直接针对他们不理解的规范化数据库编写查询……因此需要 ORM,在这种情况下是 ADO.NET 实体框架。
ORM 吓死我了。我已经看到 ORM 工具会生成非常低效的查询,这些查询会使原本高性能的数据库服务器瘫痪。在最终用户的等待和 DBA 的挫折中失去了程序员生产力所获得的东西。