2012-10-31 2 views
0

나는 출퇴근 시간 기록 용지 개체가있는 웹 응용 프로그램을 개발했습니다. 객체는 List 속성을 갖습니다. SQL Server에서는 Timesheets 테이블의 PK (Id autonumber)를 가리키는 외래 키가있는 TimesheetEntries와 함께 Timesheets 및 TimesheetEntries의 두 테이블에 반영됩니다. 현재 작업 표 객체는 사용자가 항목에 대한 삽입 및 수정을 수행하고 마지막으로 저장하는 표에 표시됩니다..Net, SQL 서버에서 부모 자식 개체 구현

작업 표를 저장하는 과정에서 모든 작업 표 항목을 삭제 한 다음 다시 작성합니다. 물론 이것은 사용자가 작업 표를 저장할 때마다 TimesheetEntries의 autonumber 필드를 밀어 넣습니다.

이것을 달성하는 가장 좋은 방법이 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

0

삭제 대신 작업 표 항목을 업데이트 한 다음 모든 항목을 다시 만들어야합니다. 기본 키를 사용하면 어떤 키가 업데이트되어야하는지 쉽게 알 수 있습니다.

또한 또는 NHibernate과 같은 Object-relational mapper을 사용하여이 작업을 자동화 할 수 있습니다.

+0

감사합니다. 내가 볼 수있는 방법은 비록 내가 작업 표의 일부가 아니었지만 삽입되어있는 새로운 항목을 삽입해야 할 수도 있습니다, 더 이상 작업 표의 일부가 아니라 마지막으로 변경된 것들을 삭제할 수 있습니다 데이터 액세스 레이어에 너무 많은 작업이 있습니까? – user1012598

+0

IMHO, 그런 작업은 DA 계층이 아니라 비즈니스 계층에 있어야합니다 ... –

+0

당신이 제안하는 것이 정말 재미 있습니다 ... BLL은 작업의 Timesheet.Save() 유형에 대해서만 걱정해야한다는 인상하에있었습니다. 그런 다음이 DB 작업을 조정하기 위해 하위 계층 (예 : 서비스 계층 또는 데이터 액세스 계층)의 메서드를 호출합니다. – user1012598

0

자동 증가 ID 열 값은 비즈니스 도메인 내에서 아무런 관련이 없습니다. 유일성과 논리적 관계를 데이터 구조 내에서 순수하게 사용합니다. 그렇습니다.이 필드가 증가하고 있습니다. 어쨌든, 당신의 관계는 TimeSheetEntry의 FK와 TimeSheet PK 사이에서 발생합니다.

이러한 레코드를 삭제했다가 다시 삽입하는 대신 업데이트하는 것이 좋습니다. 나는 귀하의 요구 사항/비즈니스 문제에 대해 확신 할 수 없으므로 더 이상 논평 할 수 없습니다.

+0

안녕하세요, – user1012598

0

약간의 추가 작업 외에도 작업 수행 방식에 별다른 문제가 없습니다. 자식 객체의 삭제 및 재 작성은 일반적인 방법입니다.

실제로 자동 증가 숫자가 올라 갔는지는 중요하지 않습니다. 모든 작업 표 항목은 해당 작업 표 외부 키를 통해 검색 할 수 있어야합니다.

자동 생성 된 숫자에 의존해서는 안됩니다. ID 필드가 올라가는 것은 중요하지 않습니다. 실제 솔루션은 서로 게이트 키가 무엇인지에 상관없이 올바르게 검색 할 수있는 일관된 방법을 찾는 것입니다.

사용자의 의견에 따라 편집

.

당신은 여전히 ​​PK와 FK를 위해 자동 번호를 사용할 것이지만, 큰 물건을 유일하게 식별하는 방법과 결합해야합니다. 이것은 보통 물건 그래프 상단의 물건입니다.

데이터베이스에 별칭 열을 포함시켜 구현합니다.

이것은 명시 적으로 조회하고자하는 모든 항목에 적용되는 고유 한 varchar 제약 조건입니다.

다음 예제를 고려하십시오. 내가 처음부터 DB를 재 구축해야하는 경우 그 변경 될 수 있기 때문에

CREATE TABLE OrderTypes 
(
    Id INT IDENTITY(1,1) PRIMARY KEY, 
    Name varchar(100), 
    Alias varchar(30), 
    Active bit, 
    ... 
) 

는 이제 이드에 의해 OrderType을보고 싶지 않아요.

이름으로 OrderType을 조회하고 싶지 않습니다. 누군가가 CMS 기능을 통해 주문 유형을 변경하면 어떻게됩니까?

별칭 개념을 사용하면 각 주문 유형에 (관리 화면) 중에서 편집 할 수없는 짧은 이름을 지정할 수 있습니다.

계속 하시겠습니까? 예를 들어, 주문서에 "purchaseorder"의 별칭과 "salesorder"의 별칭을 판매 주문서 및 별칭으로 제공 할 수 있습니다.

이 시점에서
SELECT * FROM OrderTypes WHERE Alias = 'salesorder' 

, 쿼리가 자동으로 생성 된 ID를 가지고, 그래서 당신은 더 쿼리를 만들 수 있습니다 -이 : 나는 판매 주문에 관한 OrderType 행을 취득 할 때

, 그때 사용할 수 있습니다 그 가치에 따라.

SELECT * FROM Orders WHERE OrderTypeId = <that value I just safely derived> 

자동 생성 ID는 하드 코딩보다 훨씬 더 나은 방법입니다.

+0

응답에 감사드립니다. 자동 전화 번호는 FK로 사용하지 않는 것이 좋습니다. 및 PK? – user1012598

관련 문제