2009-06-20 6 views
4

웹 응용 프로그램의 모델을 만들고 있습니다. 테이블에는 ID 필드가 기본 키로 있습니다. 내 질문은 하나의 ID를 클래스의 속성으로 정의해야하는지 여부입니다.데이터베이스에 보관 된 개체의 ID를 속성에 포함해야합니까?

개체를 테이블 구조의 표현으로 처리해야하는지 또는 개체를 유지할 수있는 수단으로 테이블을 간주해야하는지 여부는 분명하지 않기 때문에이 문제로 나뉘어 설명됩니다.

이전 루트를 사용하면 ID가 데이터베이스 테이블의 구조의 일부이기 때문에 ID가 속성이됩니다. 그러나 후자의 방법을 사용하면 ID가 데이터베이스에 속한 메타 데이터의 조각으로 볼 수 있습니다. 엄격하게 객체 모델의 일부가 아닙니다.

그리고 우리는 중간 지점에 도착합니다. ID가 실제로 모델링하려고하는 객체의 일부는 아니지만 객체를 데이터베이스에서 가져 와서 데이터베이스에 유지하고 데이터베이스의 객체 ID를 여러 작업에 중요하게 인식합니다. 시스템이므로 ID가 사용되는 상호 작용을 쉽게하기 위해 포함하는 것이 유리할 수 있습니다.

내가 솔로 개발자입니다, 그래서 좋겠 정말

+0

제쳐두고, 플랫폼이 무엇인지 언급하지 않으셨습니까? – gubby

+0

@jgubby 이것은 아마도 호스팅 비용에 달려 있지만 가능하다면 ASP.NET MVC를 사용하고 싶습니다. – Crippledsmurf

답변

8

기본적으로이 문제에 다른, 아마 경험이 많은 관점과 같은 : 예. 사용 된 모든 지속성 프레임 워크 (Hibernate, Ibatis 포함)는 ID가 객체에 있어야합니다.

나는 메타 데이터에 대한 귀하의 요지를 이해하지만 데이터베이스의 객체는 실제로 데이터베이스가하는 것과 동일한 방식으로 신원 인을 가져야합니다. 일반적으로 int 기본 키입니다. 그런 다음 객체 수준 평등이 파생되어야합니다.

때로는 이름과 성 등과 같이 기본 키가 합성되어 있습니다 (기본 키는 개체의 ID이기 때문에 '메타 데이터'가되지 않습니다)! .

나는 일반적으로 데이터베이스에 대한 개체의 ID 열을 예약합니다. 제 의견으로는 '고객 대면'목적 (예 : 고객 번호로 기본 키 ID 사용)에이 키를 사용하면 항상 나중에 발을 쏠 것입니다.

+1

마지막 포인트는 실제로 좋은 데이터베이스 디자인입니다. (기본) 키는 결코 다른 의미가 없어야합니다. 의미있는 데이터는 변경 될 가능성이 있으며, 핵심이라면 문제가 발생했을 때만 문제를 묻는 것입니다. 이것은 사용자에게 노출 될 수 없다는 것을 의미하지는 않지만, 대부분의 사람들은 "사용자 ID 69573"보다 "jgubby"가 훨씬 더 쉽게 기억된다는 것을 알게 될 것이므로 여전히 일반적으로 피해야합니다. –

+0

+1, 실제로는 내 사용자 ID입니다. – gubby

5

새로운 데이터를 독점적으로 추가하는 대신 기존 데이터를 변경 한 경우 PK가 필요합니다. 그렇지 않으면 DB에서 변경할 레코드를 알 수 없습니다.

+0

몇 분 후에 대답을 계속 추가합니다 ... wierd :). 그러나 좋은 대답! –

+0

그건 제가 충분히 고려하지 않은 점입니다. 지금은 콘텐츠 편집을 허용하지 않을 것입니다.하지만 나중에 필요할 때 추가했으면 좋겠다. – Crippledsmurf

1

ID를 속성으로 포함합니다. 오브젝트에 대한 단순한 고유 식별자는 오브젝트가 데이터베이스에 지속되는지 여부와 상관없이 종종 매우 편리합니다. 또한 데이터베이스 쿼리를 훨씬 간단하게 만듭니다.

테이블을 개체를 유지하는 수단 일 뿐이지 만 개체가 ID를 가질 수 없다는 의미는 아닙니다.

2

개체에 ID가 있어야합니다. 이건 필수 야.

예제로 제공하는 가장 쉬운 사용 사례

평등을 테스트 :

public bool Equals(Object a, Object b) { return {a.ID = b.ID}; } 

다른 건 오류에 따라, 당신은 당신이 기본 키 위반을 얻기 시작하거나 기존 데이터를 덮어 쓰기 시작할 때를 찾을 수 있습니다 .반론으로

:

당신이 객체의 ID가없는 말. 개체를 변경하고 데이터베이스의 ID가없는 경우 업데이트 할 레코드를 어떻게 알 수 있습니까? ID가 반드시 공공 재산 할 필요가 없도록 동시에

, 당신은, 내가 언급 작업이 개체 인스턴스에 정말 개인 참고해야한다.

1

은 내가 항상이 두 가지 주요 이유로 내 개체의 ID를 노출 , 테이블 심지어 개체를 유지하기위한 수단이지만, 그 사고 방식의 매우 해요 :

  1. 데이터베이스 ID는 클래스 (테이블 당 일련 번호/자동 ID ID를 사용하는 경우) 또는 보편적으로 (ID-to-class ID를 별도로 유지하는 경우) 개체를 고유하게 식별하는 가장 편리한 방법입니다. 매핑). 웹 응용 프로그램의 컨텍스트에서는 대상이 식별 할 수있는 충분한 정보가 포함 된 여러 필드를 제공하는 대신 양식에서 <input type=hidden name=id value=12345>을 지정할 수 있으면 모든 것이 훨씬 간단하고 효율적으로 수행됩니다. 충분한 식별 정보를 하나의 문자열에 연결 한 다음 양식을 제출할 때 다시 분리하십시오.)

  2. 아무렇지도 않게 데이터베이스 구조를 유지하기 위해서는 ID가 필요하며 이유는 없습니다. 아니요.이 노출되어 있어야합니다.

+0

ID를 노출시키지 않는 이유는 ID가 메타 데이터이고 실제로 문자 그대로의 의미가 아니라는 것입니다. 그러나 여기에서 응답을 읽은 나는 데이터베이스와 개체 사이의 필연적 인 관계를 설명하지 못하기 때문에이 견해가 다소 근시안적이라는 것을 알고 있습니다. – Crippledsmurf

1

개체의 ID를 읽기 전용으로 설정해야합니까? 그렇지 않습니다. 내 마음 속에는 ID가 결코 바뀌지 않을 것이라는 정의에 따라 읽기 전용이어야합니다 (데이터베이스의 레코드를 고유하게 식별하므로).
새 개체 (아직 설정되지 않은 ID)를 만들 때 새로 만든 ID를 반환하는 저장 프로 시저를 통해 데이터베이스에 저장 한 다음 ID 속성을 읽으면 개체에 다시 저장하는 방법에 문제가 발생합니다 -만?

예 :
Employee employee = new Employee();
employee.FirstName = "John";
employee.LastName = "Smith";

EmployeeDAL.Save (employee);

이 속성이 읽기 전용 인 경우 Save 메서드 (실제로 새 직원을 저장하기 위해 데이터베이스에 연결 함)는 Employee 개체의 EmployeeId 속성을 업데이트합니다 (EmployeeId는 변경되지 않습니다. 만들어진).

+0

이것은 거의 별개의 질문입니다. ID 속성이 읽기 전용인지 여부에 대한 답변으로, 일반적으로 귀하가 진술 한 이유에 따라야한다고 생각합니다. 속성은 읽기 전용 일 수 있으며 DAL은 실제로 전달 된 객체를 기반으로 다른 객체를 만들거나 DAL – Crippledsmurf

+0

에 따라 값을 변경하기 위해 리플렉션을 사용합니다. 다른 객체를 만드는 것은 나에게 잘못된 것처럼 보입니다. 귀하의 개체가 50 속성을 가지고 있다고 가정 해보십시오. 이 경우 ID 필드를 업데이트 할 수 있도록 새 속성을 만들고 모든 속성의 값을 복사합니다. DAL은 ID 필드에 쓰기 액세스 권한을 가지고 있어야하지만 ID 필드는 나머지 세계에 대해서만 읽기 전용이어야합니다. 이것은 객체가 기반한 클래스이고 DAL이 (별개로) 2 개의 개별 어셈블리에 있으면 구현하기가 약간 까다 롭습니다. – Anthony

관련 문제