なぜADO.netEntityFrameworkを使用して、ETLが機能しているように聞こえるのですか?(以下のADO.NET Entity FrameworkとORMの一般的な批評を参照してください。これは無料です)。
なぜintを使用するのですか?uniqueidentifierを使用すると、「実行中のアプリケーションの複数のインスタンス」の問題が解決されます。
列のデフォルトとしてuniqueidentifierを使用すると、intIDENTITYを使用するよりも遅くなります...intよりもguidの生成に時間がかかります。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のEntityFrameworkにどのようにマッピングしますか?
これは、ORM(Object Relational Mapping)の初期に始まった古典的な問題です。
リレーショナルデータベースのベストプラクティスを使用する場合(ベーステーブルへの直接アクセスを許可せず、ビューとストアドプロシージャを介したデータ操作のみを許可する)、人数を追加します(データベーススキーマだけでなく、すべてのビューを作成できる人。 APIを形成するストアドプロシージャ)およびプロジェクトに遅延(実際にこのようなものを書き込む時間)を導入します。
したがって、誰もがこれを削減し、人々は正規化されたデータベースに対して直接クエリを記述しますが、それは理解できません...したがって、ORM、この場合はADO.NETEntityFrameworkが必要です。
ORMは私を怖がらせます。ORMツールがひどく非効率的なクエリを生成し、それがなければパフォーマンスの高いデータベースサーバーをひざまずくのを見てきました。プログラマーの生産性で得られたものは、エンドユーザーの待機とDBAのフラストレーションで失われました。