2017-01-31 7 views
3

우리는 사용자가 정의한 사용자 정의 반올림을 사용하고 분당 반올림 규칙은 모든 사용자가 언제든지 변경할 수있는 데이터베이스 테이블에 저장됩니다.C# 및 tsql에서 사용하는 비즈니스 로직을 중앙 집중화합니다.

우리는 C#과 Sql 모두에서 동일한 코드를 사용합니다. C#에서는 캐시를 사용하여 캐시 할 때 더 빨리 읽을 수 있도록 캐시에 저장하고 Sql에서는 반올림 테이블과 결합하여 해당 분에 대한 올바른 반올림 규칙을 찾습니다.

그래서 논리를 중앙 집중화하기 위해 원래 테이블을 둥근 규칙 테이블과 결합하고 반올림 된 값이있는 두 개의 새 열을 추가하는 app 및 sql에서보기를 사용하여 생각했습니다. 그러나 이는 이미 존재하는 레코드를위한 것이므로 때로는 가치있는 값을 반올림해야하기 때문에 뷰를 사용하는 것이 우리가 바라는 대안이 아닙니다.

이 문제를 처리하는 가장 최근의 생각은 sqlclr 함수를 사용하는 것입니다. 그러나 함수 인 경우 함수는 반올림 된 값을 얻기 위해 원래 테이블과 함께 select의 모든 행에 대해 호출되며 이는 우리가 SQL 쪽에서. 이 시나리오에서 sqlclr 함수를 사용하는 방법이 있습니까? 아니면 비즈니스 논리를 중앙 집중화하는 더 좋은 방법이 있습니까?

Ex. 데이터베이스 측면에서 : enter image description here

이 기존의 접근 방식은, 지금 우리는 모든 Clockings 테이블에서 열 플러스 시작과 끝의 둥근 열을 반환하는 뷰를 가지고 있지만, 우리가 필요로하는 모든 경우를 커버 아니에요 C#에서.

죄송합니다. 링크를 보내지 못해 죄송합니다. sqlfiddle은 현재 제대로 작동하지 않습니다.

+1

예제 데이터, 사용 사례 및 원하는 결과가 도움이 될 것입니다. –

+0

다른 사용자가 동일한 시간 간격에 대해 동일한 데이터에 다른 규칙을 적용 할 수 있습니까? 아마도 날짜/시간과 함께 저장된 값을 가지며 데이터가 스탬프 된 시점에서 적용 할 수있는 반올림을 적용 할 수 있어야합니다.이 모든 것이 집계에 어떤 영향을 미치 나 그것을 피합니까? 데이터 값 및/또는 날짜/시간을 업데이트하거나 쓸 수 있습니까? .... – HABO

답변

1

비즈니스 로직을 중앙 집중화하는 일반적인 시나리오는 앱 코드에 정의 된 로직을 사용합니다.이 경우 SQLCLR을 사용하여 한 번에 두 로직 모두에서 로직을 사용할 수 있습니다.

하지만이 경우 로직은 이미 데이터베이스에 있습니다. 그리고 비록 UDF가 행마다 (심지어 IsDeterministic = true으로 표시 될 수 없기 때문에) 호출되지 않는다고하더라도, 당신이 데이터베이스에있을 때와는 다른 방식으로 .NET을 호출하는 것은 여전히 ​​의미가 없을 것입니다 그 이유는 이미 접근 할 수있는 어떤 것을 위해 데이터베이스에 다시 도달하는 것보다.

  1. 가 처음에 중앙 집중화에 대한 필요성을 재평가 :

    당신이 중 하나를 것으로 보인다. 명시적인 이유는 이제까지 주어지지했다, 그것은 단지의 경우, 두 장소에서 그것을 가지고 있지에 대한 더 나은, 그 혜택이 비용을 능가하지 않을 수 있습니다

    OR "느낌"에 :

  2. 을 정말 하는 경우 그런 다음 반올림 규칙을 사용하여 모든 계산에 대해 DB에 응용 프로그램 계층을 호출하게 할 수 있습니다 (예 : 규칙에 대해 DB를 호출 한 다음 응용 프로그램 계층에서 계산하는 것). 응용 프로그램 계층이 T-SQL과 동일한 논리를 통과하도록합니다. 이렇게하면 효과가 있지만 이점은 비용보다 중요하지 않을 수 있습니다.

+0

우리가 집중화하는 것은 중요하지 않습니다.하지만 한 곳에서 새로운 개발자가 선택 사항을 남기지 않아서 반올림을 사용하는 방법을 쉽게 이해할 수 있으며 버그를 수정하거나 구현을 변경하십시오. 약 2) 데이터베이스에 기록 된 논리는 기존의 클럭킹 레코드 용이며 일부 경우 클럭 기록을 데이터베이스에 저장하지 않고 편집하도록하고 C#의 캐시에 저장된 규칙을 사용하여 이동 중에도 클럭 기록의 시작과 끝을 결정할 수 있습니다. – Aleks