문제

Person, SpecialPerson, 고 User. PersonSpecialPerson 는 사람들-그들은하지 않는 사용자 이름 또는 비밀번호에이트,하지만 그들은 저장된 데이터베이스에 대한 기록을 유지하고있다.사용자는 모든 데이터 Person 과 잠재적으로 SpecialPerson, 과 함께,사용자가 사용자 이름과 암호를 그대로 등록된 사이트입니다.


당신은 어떻게 이 문제를 해결?당신 Person 테이블에 저장하는 모든 데이터는 일반적인 사람을 키를 사용하에서 자신의 데이터 SpecialPerson (그들은 경우 특별한 사람이)그리고 사용자는(있는 경우 사용자)과 그 반대의 경우도 마찬가지로?

도움이 되었습니까?

해결책

일반적으로있는 세 가지 방법의 매핑을 개체 상속하여 데이터베이스 테이블이 있습니다.

당신은 하나 만들 수 있습니다 큰 테이블과 함께 모든 분야에서 모든 물체를 특별한 분야에 대한 형식입니다.이것은 빠르지만 공간을 낭비하지만,현대적인 데이터베이스에 저장 공간으로 저장하지 않습 빈 필드가 있습니다.그리고 만약 당신만을 보고 모든 사용자를 위한 테이블에서 모든 유형의 사람이 그것에서 물건을 얻을 수 있습 느립니다.모든 또는 매퍼는 이것을 지원합니다.

할 수 있는 다양한 테이블에 대한 모든 다른 아이와 함께 클래스의 모든 테이블을 포함하는 기본 클래스 필드가 있습니다.이 성능에서 관점입니다.하지만에 유지 관리의 관점이다.모든 시간의 기본 클래스의 변경 테이블을 모두 변경됩니다.

할 수 있도는 테이블당 클래스는 다음과 같습니다.이 필요한 방법으로 결합하여 모든 데이터를 얻을.그래서 그것은 덜 성능.나는 그것이 가장 깨끗한 솔루션입니다.

당신이 사용하고 싶은 물론 귀하의 상황입니다.없음의 솔루션이 완벽한 그래서 당신은 무게 장단점이 있습니다.

다른 팁

을 살펴 Martin Fowler 의 패턴 기업의 애플리케이션 아키텍처:

  • 단일 테이블을 상속:

    매핑할 때,관계형 데이터베이스는 최소화하려고 결합할 수 있는 신속하게 산업을 처리할 때는 상속 구조에서 여러 테이블이 있습니다.단일 테이블을 상속도 모든 분야의 모든 종류의 기업 구조를 하나의 테이블.

  • 클래스를 상속 테이블:

    당신이 원하는 데이터베이스 구조는 지도 분명하게 개체를 허용한 링크를 어디서나 상속의 구조입니다.클래스 테이블 상속 지원 이 중 하나를 사용하여 데이터베이스 테이블당 클래스를 상속의 구조입니다.

  • 콘크리트 테이블 상속:

    생각의 테이블에서 객체를 인스턴스의 관점,합리적인 경로를 각각의 물체에 메모리고 지도하는 단일 데이터베이스 행이 있습니다.이 의미 콘크리트 테이블 상속가 있는 테이블에 대한 각 콘크리트에서 클래스를 상속의 계층 구조입니다.

사용자의 경우,사람 및 특별한 사람은 모두 동일한 외국인 키,나는 것이 있습니다.추가 열라고 입력 있는 제한된 수의 사용자,사람 또는 특별한 사람입니다.다음에 기반한 가치의 유형에 대한 제약 조건 다른 선택적인 열이 있습니다.

대체 코드를 만들지 않는 많은 차이가 있는 경우 별도의 테이블 또는 여러 테이블을 나타내는 다형성이다.그러나 만약 당신이해야 할 SQL 데이터베이스에 대해,그것은 훨씬 쉽게는 경우 다형성에 포착된 하나의 테이블 제공되는 외국 열쇠를 하위 유형은 동일합니다.

내가 무슨 말 하려고 여기고 보낼 데이터베이스 건축가로 conniptions 하지만 여기:

을 고려한 데이터베이스 보기 로에 해당하는 인터페이스를 정의합니다.와 테이블은 해당 클래스입니다.

그래서 예에서,모두 3 인 클래스를 구현하는 것 IPerson 인터페이스입니다.그래서 당신은 3 테이블-중 하나에 대한 각각의'이용자','사람'과'SpecialPerson'.

그런 다음 뷰'PersonView'또는 어떤 선택하는 일반적인 속성(에 의해 정의된'인터페이스')에서 모든 3 테이블에 하나의 화면에 표현합니다.사용'PersonType'칼럼에서 이보기를 저장하는 실제 유형의 사람되고 저장됩니다.

그래서 실행하고 있는 경우 쿼리할 수 있는 운영에서 모든 유형의 사람,그냥을 쿼리 PersonView 보기입니다.

이 되지 않을 수도 있습 OP 의미한 질문,하지만 나고 생각할 수 있습이 여기에 있습니다.

나는 최근에 독특한 경우의 db 다형성에서 프로젝트입니다.우리는 사이 60~120 클래스에 가능한,자신의 각각의 설정이 30~40 유일한 속성,그리고 약 10-12 일반적인 속성의 모든 클래스입니다.우리는 이동하기로 결정했 SQL,XML 로 끝났습니다.다음과 같습니다.

PERSON (personid,persontype, name,address, phone, XMLOtherProperties)

을 포함하는 모든 일반적인 속성을 열고 다음 큰 XML 산 가방입니다.The ORM 층 다음에 대한 책임은 읽기/쓰기 각각의 속성에서 XMLOtherProperties.과 같은 비트:

 public string StrangeProperty
{
get { return XMLPropertyBag["StrangeProperty"];}
set { XMLPropertyBag["StrangeProperty"]= value;}
}

(리 매핑 xml 열 Hastable 보다는 XML 문서를 사용할 수 있지만 어떤 맞 DAL 최)

그것은 거기 디자인 어워드,하지만 그것은 작품이 큰 경우(또는 알 수)의 번호를 가능한 클래스입니다.에 SQL2005 계속 사용할 수 있습 XPATH 에서 SQL 쿼리를 행을 선택에 따라 일부 시설로 저장된 XML..그것은 단지 작은 성능 저하를 취합니다.

에 있는 세 개의 기본 전략에 대한 처리 상속에 관계형 데이터베이스의 수는 더 복잡/맞춤 대안에 따라 정확히 필요합니다.

  • 테이블당 클래스 계층 구조입니다.한 테이블에 대한 전체적인 계층 구조입니다.
  • 테이블당 서브 클래스.별도의 테이블을 만들에 대한 모든 하위 클래스로 0-1 간의 연결 하위 테이블이 있습니다.
  • 테이블당 콘크리트 클래스입니다.단일 테이블을 만들에 대한 모든 콘크리트 클래스입니다.

이러한 각각의 appoaches 제 자신의 문제에 대해 정상화,데이터에 액세스 코드 및 데이터 저장이지만,내 개인적인 두번째를 사용하는 것입 테이블당 서브 클래스 가 아니라면 특정 성능 또는 구조적 이유를 가진 하나의 대안입니다.

에서의 위험에는'건축물의 우주 비행사',여기에 나가는 것이 더 기울어 가는 별도의 테이블 위해 서브 클래스.는 기본 키의 하위 테이블 또는 외국 키를 다시 연결 상위 유형.

주요 이유로 그것을 하기를 위한 이 방법은 다음은 훨씬 더 많은 논리적으로 일관하고 당신은 끝나지 않는 최대의 많은 필드에는 NULL 이 무의미한 특정한 기록합니다.이 방법은 또한 그것은 훨씬 더 쉽게 추가 필드를 추가 특수형으로 반복하는 당신의 디자인 프로세스입니다.

이것은 추가의 추가 조인하는 귀하의 질의 성능에 영향을 미칠 수 있습,그러나 나는 거의 항상 이상적인 디자인이 처음이며,다음을 최적화하는 경우 나중에 그것을 증명할 필요합니다.몇 번 갔는'최적의'방식으로 처음에 나가 거의 항상 후회됩니다.

그래서 나는 디자인 것 같은 뭔가

사람(personid,이름,주소,전화,...)

SPECIALPERSON(personid 참조 사람(personid),는 추가 필드...)

사용자는(personid 참조 사람(personid),사용자 이름,encryptedpassword,추가 필드...)

할 수 있도를 만들 수 있으며 이후에는 집계 상위 유형과 특수형,경우에는 필요합니다.

하나 결함에 이러한 접근은 자신을 찾을 경우 심하게 검색에 대한 하위와 관련된 particulare 퍼.가 쉽게 대답이 내 머리 위로,당신을 추적 할 수 있는 프로그래밍 방식으로 필요한 경우,또는 다른 실행 soem 글로벌 쿼리고 캐시 결과입니다.그것은 정말 응용 프로그램에 따라 달라집니다.

내가 말하는데,에 따라 어떤 사람을 차별화하고 특별한 사람,당신은 아마 원하지 않는 다형성에 대한 이 작업입니다.

나는 사용자 만들기 테이블,사람이가 있는 테이블이 null 을 허용 외국의 키 필드를 사용자가(i.e 이 사람이 될 수 있는 사용자만 있지 않습니다).
그때 저는 SpecialPerson 테이블에 관한 사람 테이블과 함께 어떤 추가 필드에서습니다.레코드에 있는 경우에 존재하 SpecialPerson 주어진 사람입니다.ID,he/she/그것은 특별한 사람입니다.

우리 회사에서 다루는 다형성을 조합하여 모든 분야에서 한 테이블과는 최악의 없 참조 무결성 강제 적용될 수 있습과 이해하기 어려운 모델입니다.내가 권하고 그에 대해 접근을 확실합니다.

것으로 테이블당 서브 클래스고,성능상 하지만 사용하 ORM 우리가 할 수 있습을 피하기로 합류의 모든 하위 테이블을 쿼리에는 비행에 기초를 두는 유형입니다.앞서 언급한 전략에 대한 하나의 수준의 기록을 당겨지만 대량으로 업데이트 선택하거나 당신은 그것을 피할 수 없습니다.

그렇다,나는 또한 고려한 포인터를 사용 하 여 수신과 함께 PersonType 테이블 가능한 경우 더 많은 종류가있을 것입니다.그러나만 있는 경우 3 할 수 없습니다.

이전 게시물만을 생각 나는 것에 무게에서 개념적,절차 및 성능 관점에서.

첫 번째 질문가 간의 관계는 사람,specialperson,그리고 사용자는지 여부,그것은 사람에 대한 가능한 것 모두 a specialperson 과 동시에 사용자에.또는,어떤 다른 4 가능한 조합(등급 a+b 클래스 b+c 등급 a+c,또는 a+b+c).이 클래스는 값으로 저장됩에 type 필드 그러므로 축소 이러한 조합,그리고는 붕괴가 받아 들일 수 있다면,내가 생각하는 것 보조 표 필요한 것에 대한 허용을 많은 관계이다.배웠지 않을 판단할 때까지 평가하는 사용량과 비용을 잃고 귀하의 조합 정보입니다.

는 다른 요인은 나를 향해 기대 테이블 하나입니다 당신의 시나리오에 대한 설명. User 은 엔티티와 사용자 이름(말 varchar(30))과 암호(말 varchar(32)).는 경우에는 일반적인 분야'가능한 길이가 평균 20 자당 20 필드에 다음의 열의 크기가 증가하는 62 400,또는 약 15%-10 년 전이었을 것 보다 더 많은 비용이 많이 드는것과 함께 현대적인 RDBMS 시스템,특히 필드를 입력 varchar(예:MySQL)사용할 수 있습니다.

그리고,보안은 당신에게 관심사,그것은 것이 유리할 수 있습을 보조하는 하나의 테이블라 credentials ( user_id, username, password).이 테이블에서 호출되는 가입 문맥에서 말하는 로그인하지만,구조적 분리에서"사람"에서 주요 테이블.그리고, LEFT JOIN 사용할 수 있는 쿼리에 대해 고려할 수 있습니다"사용자 등록".

나의 주요 고려 사항은 몇 년 동안은 여전히 고려하는 개체의 중요성(고 따라서 가능한 발전)외부 DB 와 현실 세계에서.이 경우에는,모든 유형의 사람은 마음을 치고(나는 희망한다)및 수 있습니다 또한 계층에 대한 관계;그래서 다시 나의 마음의하지 않는 경우에도,이제,우리는 저장해야 하는 이러한 관계에 의해 다른 방법이다.지 않는 명시적으로 관련 당신의 질문에 여기에,그러나 그것은 또 다른 예의의 표현하는 객체 관계입니다.지금은(7 년 동안 나중에)당신이 있어야 좋다는 방법에 대한 통찰력을 당신의 결정이 어쨌든 일:)

과거에 나는 그것을 정확하게 당신이 제안하는 있는 사람 테이블에 대한 일반적인 물건,다음 SpecialPerson 연결된 파생된 클래스입니다.그러나 내가 다시 생각하는,로 Linq2Sql 원하는 필드에서 같은 테이블을 나타냅니다.나는 본 적이 없 entity 모델 너무 많은지 확신할 수 있는 다른 방법이다.

개인적으로 저장하는 모든의 서로 다른 이용 클래스에서는 하나의 테이블.할 수 있습니다 다음 중 하나는 저장하는'유형'가치,또는 당신할 수 있는 암시하는 어떤 유형의 사람이 함께 다루고 있으로 어떤 분야로 가득 차 있습니다.는 경우,예를 들어,사용자 Id NULL,다음이 기록되지 않은 사용자.

할 수 있는 링크를 다른 테이블을 사용하여 하나 또는 없음의 유형에 가입하지만,그럼에서 쿼리를 추가 할 수 있는 추가합니다.

첫 번째 방법은 또한 지원 LINQ-to-SQL 결정하는 경우 아래로 이동하는 경로(그들이 부르는'테이블당 계층에'또는'TPH').

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top