2010-12-07 2 views
1

.net 1.1 기반의 기존 웹 사이트 (.net 1.1 기반)를 사용하여 데이터에 액세스합니다. 웹 서비스는 SQL을 실행하는 저장 프로 시저를 호출합니다.디자인 질문 - C#으로 여러 행 업데이트 - 다중 왕복 이동에 대한 걱정

많은 자식 개체 (설명) (5-25)가있는 부모 개체 (문자)가 있고 각 자식 개체의 한 열을 새로운 값으로 업데이트해야합니다. 주석에 플래그를 설정해야합니다 예를 들어 승인 된 상태로 설정하는 경우 -이 속성은 나중에 승인되지 않은 메모를 추가 할 수 있으므로 메모가 아닌 메모에 있습니다.

우리가 취할 수있는 일반적인 접근 방식은 새로운 웹 방식을 만드는 것입니다. ApproveComments를 승인하고 letterID를 전달하여 편지에있는 모든 주석을 승인되도록 설정하십시오. 그런 다음 ApproveCommentsOnLetter 저장 프로 시저를 호출하여 ApprovedFlag를 true로 업데이트합니다 (letterID = 전달 된 매개 변수).

이 접근 방식은 시간이 지남에 따라 시스템의 특정 영역에 새로운 기능이 추가되면서 매우 특정한 웹 서비스 호출과 매우 특정한 저장 프로 시저로 끝나는 경향이 있음을 의미합니다. 그래도 괜찮습니다.하지만 우리는 항상 새로운 코드를 작성하고 있으며 어떻게 다른 방식으로 작업 할 수 있는지 생각하고 있습니다. 나는 .net 버전을 지금은 작은 변화로 바꿀 수는 없지만 시간이 지남에 따라이 응용 프로그램을 계속 업데이트 할 때 다르게 접근하는 방법을 고려하고 있습니다.

내가 가진 아이디어는 대신 UpdateComments라고하는보다 일반적인 웹 메서드를 만드는 것입니다.이 메서드는 모든 주석 업데이트에 사용됩니다. 나는 이것들에 Comments 객체들의 배열을 전달할 것이다.이 객체들은 get/set 속성을 가질 것이다. 이 경우에는 루프를 통해 각각의 Status 속성을 True로 업데이트 한 다음 웹 메서드에 보내기도하지만 나중에 다른 웹 메서드를 만들지 않고 유사한 방식으로 다른 열을 설정할 수 있습니다.

나는 데이터베이스 섹션을 약간 비틀 거리고있다. 다음 단계는 UpdateComment 저장 프로 시저를 갖는 것입니다. 나는 차례 차례로 각 코멘트에 대해 한 번씩이 여러 번 호출해야합니다. 나는이 호출 (5-25 현재)에 대한 데이터베이스로의 반복 된 왕복 횟수를 많이 만드는 것이 매우 효율적이지 않으며 단지 일반적으로 이라고 느낀다는 것을 알고 있습니다. 다른 방법은 볼 수 있지만 이러한 '일괄'업데이트는 특정 웹 메서드 및 저장 프로 시저를 사용하여 한 번에 특정 속성을 업데이트하는 데 사용되는 것입니다. 그런 다음 다시 새 만들기로 돌아 왔습니다. 프런트 엔드에 추가하는 각각의 새 기능에 대한 웹 메서드 및 저장 프로 시저를 제공합니다.

이 접근 방법에 대한 생각에 감사드립니다. ORM/새 버전의 .net/등을 추가 할 수 없으므로 .net/등의 새 버전을 추가 할 필요가 없습니다. 기술을 사용하고 있습니다.

답변

1

다음 단계는 UpdateComment 저장 프로 시저를 갖는 것입니다. 그럼 이걸 여러 번 호출해야합니다.

웹 서비스가 주로 행 컬렉션에 관심을 갖는 반면 데이터베이스는 행 컬렉션을 처리하지 않습니다.

저장 프로 시저에서 응용 프로그램 제어 데이터 수정으로 이동할 수있는 경우 SqlCommand 텍스트에 여러 업데이트 문을 패키지 할 수 없다는 내용은 없습니다.

아니면 옵션이 아니라면, 한 번의 왕복으로 여러 번 저장 프로 시저를 호출 할 수 없다는 것은 아무것도 없습니다.내가 당신이라면

+0

"옵션이 아니면 1 회 왕복으로 여러 번 저장 프로 시저를 호출 할 수 없다는 내용은 없습니다." - 동료 개발자는 평균적으로 동일한 작업을 사용자 작업 당 5 번 (잠재적으로 최대 25 번) 호출하는 것이 a) 성능에 좋지 않고 b) 나쁘다는 점을 우려합니다. 두 가지 방법 중 하나를 수행하는 데 필요한 성능 수치가 없습니다 (아직 작성하지 않았으므로) "조숙 한 최적화"인지 또는이 접근 방식에 대한 중요한 관심인지 여부에 관심이 있습니다. – Durathor

+0

여러 번 라운드 트립에 성능 차이가 있습니다. 또한 하나의 명령문이 수행 할 때 많은 갱신 명령문을 사용하면 성능 차이가 더 적습니다. 시기 상조인지 여부는 앱에 따라 다릅니다. 25 개 왕복 여행은 많은 앱에서 괜찮을 수 있습니다. 50,000 왕복은 대부분의 앱에서 괜찮지 않을 것입니다. 측정이없는 최적화는 기술적으로 조기입니다. –

1

@Durator

나는 웹 서비스에 특정 호출을 만들기보다는 시도하고 통화의 일반적인 종류를 만들의 길을 계속 것입니다. 약간의 작업일지도 모르지만 장기적으로는 시스템이 훨씬 유지 보수 가능하고 사실 비즈니스 중심의 추상화 계층을 제공하기 때문에 비용이 절감됩니다. 즉, 비즈니스 프로세스 관점에서 주어진 프로세스에 대한 설명을 승인하는 것입니다. 이를 수행하는 구체적인 방법은 비즈니스 프로세스와 매우 명확하게 매핑됩니다.

지금까지 여러 번의 왕복 이동에 관해서 ... 웹 서비스는 문자 ID와 함께 일련의 주석 ID를 허용 할 수 있습니다. 그렇게하면 문자 ID와 업데이트해야하는 주석 ID 배열이 포함 된 전화를 통해 한 번의 호출이 이루어집니다.

구현은 몇 가지 방법으로 수행 할 수 있습니다. 1. 저장 프로 시저에 쉼표로 구분 된 ID 배열을 SP에 보내고 ID를 분할하고 업데이트합니다.

MS SQL 서버 2008을 사용하는 경우 TableValueParameter 또는 TVP라는 새로운 변수 유형이 있습니다. 기본적으로 storped proc에 보낼 레코드 (열과 행)가 포함 된 .NET DataTable을 보낼 수 있으며 SP에서는 매개 변수를 "테이블"로 처리하여 사용하는 조인을 수행 할 수 있습니다 귀하의 업데이트.

1

첫눈에 한 행당 하나의 호출을 만드는 것이 올바른 방법이 아닌 것처럼 보이지만 시도해보고 보시기 바랍니다. 확실히 가장 간단합니다. 제작 과정에서 사용자가 느끼는 성능 문제는 없습니다.