왜 ETL 작업처럼 들리는 것을 할 ADO.net 엔티티 프레임 워크를 사용하고 있습니까? (아래의 일반적으로 ADO.NET Entity Framework 및 ORM에 대한 비평을 참조하십시오.
int를 사용하는 이유는 무엇입니까? uniqueidentifier를 사용하면 "실행중인 응용 프로그램의 여러 인스턴스"문제가 해결됩니다. 있는 int IDENTITY를 사용하는 것보다 느립니다 열 기본값으로 고유 식별자를 사용
는
... 그것은 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의 엔티티 프레임 워크이지도 않아 ...인가?
이 ORM의 초기에 시작 고전적인 문제는 (객체 관계형 대응)입니다.
관계형 데이터베이스 모범 사례 (기본 테이블에 대한 직접 액세스를 허용하지 않고 뷰와 저장 프로 시저를 통한 데이터 조작 만 허용)를 사용하면 헤드 카운트 (데이터베이스 스키마뿐만 아니라 쓸 수있는 사람도 있지만 또한 모든 뷰와 API를 구성하는 저장 프로 시저)를 생성하고 지연 (실제로이 내용을 쓰는 시간)을 프로젝트에 도입합니다.
모든 사람들이 이것을 자르고 사람들은 이해하지 못하는 정규화 된 데이터베이스에 대해 직접 쿼리를 작성하므로 ORM,이 경우 ADO.NET Entity Framework가 필요합니다.
ORM은 나에게서 두려움을 두려워합니다. 나는 ORM 도구가 무의미하게 비효율적 인 쿼리를 생성하여 성능이 뛰어난 데이터베이스 서버를 무릎 꿇게 만듭니다. 프로그래머 생산성에서 얻은 결과는 최종 사용자 대기 및 DBA 좌절에서 사라졌습니다.
데이터 (자식 행과 부모 행)를 삽입하는 순서는 '외부 키'데이터 무결성을 적용하지 않는다는 것을 의미합니다. 이게 옳은 거니? 왜? – van
동의 - 귀하의 프로세스가 거꾸로 된 것처럼 들립니다. 먼저 PK로 레코드를 작성한 다음 종속 레코드를 추가해야합니다. 아니면 당신은 당신의 일치를 위해 참 (대리가 아닌) PK를 사용해야합니다. – dkretz
그게 옳은 이유는, 결정이 내려 졌을 때 내가 여기 없었기 때문에 나는 말할 수 없었습니다. 내 유일한 추측은 성과입니다. 부모 테이블은 한 번에 수백만 개의 레코드가 삽입되는 반면, 자식 레코드는 거의 없습니다. 사실 부모 테이블에서 항목을 삭제하는 동안 자식 테이블의 행이 삭제되지 않습니다. 다 대일 매핑 (부모 - 자식)이므로 삭제하지 않기로 한 것 같습니다. 나는 그것을 나중에 조사 할 수 있습니다. – esac