2013-01-23 1 views
1

를 증가 I 테이블을 갖는다. RecipeID에 대한 외래 키 관계가 명시적일 필요는 없습니다. 특정 레서피에 대해 Instructions에 단계를 삽입하면 Step을 증가 시키길 원합니다. 새로운 조리법에 단계를 추가 할 때 step과 같이 0에서 다시해야한다 :부분 PK

RecipeID | Step 
--------------- 
    0 | 0 
    0 | 1 

RecipeID | Step 
--------------- 
    0 | 0 
    0 | 1 
    0 | 2 

RecipeID | Step 
--------------- 
    0 | 0 
    0 | 1 
    0 | 2 
    1 | 0 

가 어떻게 행동 유형을 생성 할 ?

+0

레코드를 어떻게 삽입합니까? 프런트 엔드 UI는 어떤 유형의 응용 프로그램입니까? – mellamokb

+0

asp.net mvc 웹 응용 프로그램. 나는 그것을 수동으로 할 수있다. SQL-Server가 이런 행동을 단독으로 수행 할 수있는 방법이 없는가? – Jeff

+0

그것은 어리 석음으로 복잡해지기 시작할 수 있습니다. 예를 들어 삽입 또는 삭제를 통해 단계의 순서를 바꾸려면 어떻게해야할까요? 이것은 발생하지 않으려 고하는 고통스러운 버그의 목록 일뿐입니다. PK로 RecipeStepID. 그런 다음 RecipeID 및 StepNumber에 대한 색인을 작성하십시오. –

답변

2

이 당신의 자신의 질문이 가난한 생각 표시하지 마십시오. 어떻게 부분 키를 가질 수 있습니까? 정의에 따라 부분 키는 고유 할 수 없습니다.

단계에서 필요한 유일한

는 n은 0이 사소한와 같은 순서를 표시 (또는 그들을 밖으로 쿼리 ROW_NUMBER 말)입니다. 당신이 그들을 당신이 놓친 단계를 삽입하거나 교체하기 위해해야 ​​할 것이 무엇에 대해 생각

...

RecipeStepID 인덱스

로 (같은 대리 기본 키)

RecipeID, STEPNUMBER 테이블에

모든 외래 키 링크는 다시 주문 단지 스텝 번호

네바다에 대해 어지럽히 그런 다음 서로 게이트 키

를 사용 당신이 재앙이되지 않도록 노력하고있는 apprioach를 보았습니다. 그리고 그것은 제 장갑을 벗지 않고 재앙으로 시작하지 않은 횟수를 셀 수 있습니다.

0

면책 조항 : 하단에있는 노트를 참조하십시오. 꼭 트리거를 사용하는 것은 권장하지 않습니다.

당신은 삽입 할 step의 값을 변경하는 instead of 트리거를 사용할 수 있습니다 :이 원활 단일 또는 여러 레코드의 삽입을 처리해야

Create Trigger Instructions_UpdateSet 
    On [Instructions] 
    Instead of Insert 
AS 
BEGIN 
    insert instructions 
    select 
    i.recipe, 
    coalesce(ii.maxstep, -1) 
     + row_number() over (partition by i.recipe order by i.step), 
    i.instruction 
    from inserted i 
    left join (select recipe, max(step) as maxstep from instructions group by recipe) 
    ii on i.recipe = ii.recipe 
END; 

. 단일 쿼리에 여러 레코드를 삽입하는 경우 들어오는 레코드의 순서를 나타 내기 위해 step 값을 제공 할 수 있으며 적절하게 정렬되고 기존 레코드 다음에 순차적으로 번호가 매겨집니다.

데모 : 응용 프로그램에서 트리거를 사용하는 경우 http://www.sqlfiddle.com/#!6/b13d5/1


몇 가지 참고 :

  • 그들은 매우 잘 숨기 때문에 트리거 잊어하는 것은 매우 쉽습니다. 그것들을 문서화해야한다. 그렇지 않으면 삽입 한 데이터가 데이터베이스에서 동일하지 않을 때 다음 개발자가 혼란 스러울 것이다.
  • 캐싱 계층을 사용하는 경우 레코드 삽입 후 캐시를 새로 고쳐야 트리거로 인한 변경 사항을 가져와야합니다.
  • 일반적으로 비즈니스 로직에 대한 트리거를 피하는 것이 좋습니다.성능을 찾고 있다면 스토어드 프로 시저를 사용하는 것이 더 나을 것입니다. 스토어드 프로 시저는 의도와 동작에 대해 훨씬 더 분명합니다. 트리거는 데이터 유효성 검사, 계단식 업데이트/삭제, 감사 등과 같은 투명한 작업에 가장 적합합니다.
+0

내가 말했듯이 복잡하다. –