2009-04-07 1 views
0

의학 영역에서, 환자는 시험 톤 (HbA1C, 지질, 신장 등)을 가지고 있으며 기본적으로 모두 ExamX (ID, ID_Patient 당신이 SuperExam (ID, ID_Patient, ExamType, 날짜를 사용하여 하나에 여러 테이블에서 갈 수의학 가치 : 1 개의 최고 시험 테이블 또는 많은 시험 테이블

그러나, 날짜, 값) 값)

한 참고 값은 두 번째 테이블에서 분리하지 않을 것입니다. 일부 시험은 여러 값을 가지고 있으므로 구분해야합니다. Ex 값 = .9,105,108, .4

일반적으로 첫 번째 형식을 사용했지만 두 번째 구조도 여러 번 보았습니다. 두 번째 버전에서는 db 스키마를 변경하지 않고도 데이터에 더 많은 유연성을 부여 할 수 있지만보고가 악몽처럼 보일 것으로 보입니다.

더 나은 디자인은 무엇입니까?

답변

1

아마 다른 방법으로 EAV 접근법을 사용하고 데이터 사전을 만들어야 할 것입니다. 그런 다음 검사에 대한 특정 데이터를 저장할뿐만 아니라 검사의 데이터를 정의하는 데이터 (검사 템플릿, 값 간의 관계 등)를 저장하는 테이블 구조도 갖게됩니다. 기본적으로 RDBMS의 관계형 측면을 사용하여 자신의 관계 시스템을 작성합니다.

이것은 복잡한 것처럼 들리지만, 어느 정도까지는 보일지도 모르지만,이 의료 시스템을 확장 가능하고 유지할 수 있도록하려는 경우 장기적으로 볼 가치가 있습니다.

하나의 열에 여러 값을 저장하지 마십시오. 이제까지. 어떤 이유로.

여기

exam: 
    exam id, 
    date, 
    patient id, 
    ...other miscellaneous scalar data thats 1-1 with an exam 

exam value: 
    exam value id, 
    exam id, 
    value id, 
    value 

이 시험 데이터를 저장하기위한 기본적인 구조 ... 간단한 예입니다. 그렇다면 ...

value: 
    value id, 
    description 

group: 
    group id, 
    description 

group value: 
    group value id, 
    group id, 
    value id, 
    sort order 

다시 말하지만, 아주 기본적이고 초보적이지만, 내가 말하는 것에 대해 잘 보여줍니다. 한 단계 더 나아가 특정 그룹이있는 특정 시험 유형을 정의한 다음 시험 유형을 시험에 배정하고 싶지만 그 내용은 귀하에게 맡깁니다.

+0

정말 도움이되었습니다 - 고마워요! – Aaron

+0

@Adam :이 모델을 함께 넣어 봤는데 아주 멋지다. 그래도 다른 물건을 둘러 보았을 때 나는이 링크를 발견했다 : http://stackoverflow.com/questions/408779/linq-to-sql-order-by-value-in-related-table/408806#408806 EAV는 일반적으로 좋은 것이 아니라고 말했습니다. – Aaron

+0

좋은지 여부는 일반적으로 애플리케이션에 달려 있습니다. 당신은 변화에 대한 유연성 (유리한 EAV)과 희소 한 데이터 (유리한 EAV)를 수용 할 수있는 능력과 질의의 용이성과 통제 불능의 가능성 (EAV의 단점)의 균형을 맞추어야합니다. –

0

# 2라고 말하고 싶습니다. "ExamType = X"조건을 추가하는 것만으로 간단하게 # 1로 변환 할 수 있습니다. 그렇지 않으면 다발을 필요로하는 여러 검사 (예 : "Patient Bob의 모든 검사 표시")와 같은 쿼리를 만드는 것이 더 쉽습니다 (그리고 당신은 이미 유연성을 언급했다)

편집 : oops 나는 질문을 잘못 읽었다. 쉼표 분리 값 같은 것을하지 마십시오. ("JOINS가 비싸기 때문에 2 개의 테이블을 만들 필요가 없습니다"는 유효한 이유가 아닙니다.)

0

두 번째 형식은 실제로 새로운 형식에 대해 새 테이블을 만들 필요가 없기 때문에 더 융통성이 있습니다 시험의; 대신 Exams 테이블에 다른 행을 추가하기 만하면됩니다.

즉, 한 시험에서 여러 값의 문제가 여전히 발생했습니다. 구분 된 값을 사용하는 대신 SuperExam 테이블을 특정 날짜의 시험과 환자 연결 용 테이블과 행당 하나씩 각 이벤트의 모든 값을 제공하는 두 테이블로 나눌 수 있습니다. 이를 "정규화"라고합니다. 임의 (ad-hoc) 질의에서는 JOIN 절을 사용하여 다시 넣습니다.

-1

나는

이 SuperExamTable을 가지고 ExamType과 가치의 탐을 얻을 ... 그것은 # 2를 소요하고 확장 ... A # 3의 다소 제안 할 수 있습니다. 다음 값을 갖는 ExamDetail이라는 새 테이블을 만듭니다. ExamDetailId, SuperExamId, ExamType 및 값

이렇게하면 환자가 여러 검사 유형과 값을 가질 수있는 특정 날짜에 검사를 가질 수 있습니다.

+0

ok ... 쉼표로 구분 된 값을 파싱하는 것이 재미 있습니다. – bytebender

4

여러 값 (예 : 쉼표로 구분 된 목록)이있는 단일 필드를 패킹하는 것은 첫 번째 정규 양식 규칙을 위반하는 것입니다 (특히 반복 그룹이없는 것은 아닙니다).

첫 번째 정규 형식이 아닌 데이터베이스 디자인은 꽤 의문의 여지가 있습니다. 일반적으로 어림짐작은 비정규 화 (denormalizing)를 통해 정규 형식으로 설계하고, 성능을 최적화하며, 때로는 편의를 제공합니다.

공통 검사 테이블 (ExamId, ExamType, PatientId, OccurredOn) 및 특정 관련 테이블 RenalExamination (ExamId, Rate, Hue), 지질 검사 (ExamId, LCount, YCount) 등이 더 나은 선택 일 수 있습니다.

정말하고있는 일에 달려 있습니다. 이것이 의료 실험실 응용 프로그램의 핵심이라면 훨씬 더 많은 설계 작업이 필요합니다. 확실하게 나는 정규화 된 데이터베이스를 목표로하고 "거꾸로"작업 할 것입니다.

3

아야.또 다른 새로운 스크래치 건강 검진 데이터베이스 설계.

경험을 통해 설명하는 것보다 훨씬 더 세심하고 복잡합니다.

예 : 혈압에는 수축기 및 이완기의 2 가지 측정치가 있습니다.

예 : 일반적으로 많은 테스트가 동시에 수행됩니다. 그들의 의미는 측정 간의 상호 관계 (문맥 정보 및 텍스트 해석과 함께)에서 나온다.

몇 가지 조사를 해보고 최소한부터 시작할 수있는 기존 디자인을 찾으십시오.

+0

확실한 조언. 어떤 특정 URL을 전달하고 싶습니까? – user53794

+0

미묘하게 기존 디자인의 예가 좋겠지 만, 기존 디자인은없는 것입니다. 내가 기존의 훌륭한 디자인으로 볼 수있는 장소에 대한 권장 사항이 있으면 감사하게 생각합니다. – Aaron

0

당신의 직감이 옳습니다. "SuperExam 테이블"은 엔티티 - 애트리뷰트 - 밸류 (Entity-Attribute-Value) 데이터베이스라고 불리는데, 스파 스 데이터가 단일 엔티티에 묶여있는 임상 기록에 자주 사용됩니다.

E-A-V 테이블은 쉽게 검색 할 수 있습니다. 문제는 행을 찾는 것이 아니라 관련 행을 찾는 것입니다.

서로 다른 엔티티에 대해 서로 다른 테이블을 사용하면 도메인 모델링이 가능하지만 약한 형식의 메타 데이터도 제공합니다. E-A-V에는 그러한 추상화가 없습니다. (EAV에 대한 Java의 비유는 모든 함수의 형식적 인수가 Object 유형이라는 것을 알 수 있으므로 유형 검사가 필요하지 않습니다.)

우리는 쉽게 속성 키를 찾을 수 있지만 이들 속성을 그룹화하지는 않습니다 열쇠. 모든 혈액 검사를 묶거나 체중과 혈액 검사를 구별 할 수있는 방법이 없습니다.

하나의 절충안은 EAV를 사용하고 examtype에 대해 더 많은 데이터를 제공하고 /하거나 그룹화하여 다른 테이블에 대한 foreign key를 다른 테이블로 만드는 것입니다.

위키 피 디아는 E-A-V에 대해 매우 좋은 기사를 가지고 있지만, 지금은 한 저자의 저작물이며 "개선"이 예정되어 있습니다.