2016-06-07 3 views
2

나는 다소 복잡한 클래스를위한 좋은 모델을 제시하려고합니다. 서로 독립적 인 엔티티가 두 개 있습니다 (응용 프로그램 내에서 자체적으로 사용하기 때문에), 사용자 그룹 및 이벤트 유형이 있습니다.C#의 데이터 모델링

사용자 그룹에는 권한이 부여 된 이벤트 유형 목록이 있습니다. 그 외에도 나중에 대체 할 앱 문자열을 알려주는 사용자 그룹 및 이벤트의 각 조합에 적용되는 문자열 목록이 있습니다 (따라서 사전은 키가 대체 할 필드이고 값은 대체 할 값입니다) 와).

SQL 배경이 더 많아서 테이블과 기본 키의 관점에서 생각하기 쉽습니다. Dictionary<int, Dictionary<tuple<int, string>, string>> 또는 Dictionary<int, Dictionary<int, Dictionary<string, string>>>

I와 같은 구조를이 구조는 UserGroupID, EventTypeID, NameToReplace을 키가 될 것입니다,하지만 난 C#에서 그것을 할 수있는 방법을 마련 할 때, 나는 (나는 그들이 추악한라고 생각하거나 적어도) 추한와 끝까지 또한 사전 개념을 없애고 튜플 목록 또는 모든 논리적 "키"를 함께 묶는 사용자 정의 클래스 목록을 만들 수 있습니다.

내 질문에이 종류의 중첩 된 컬렉션 구조가 일반적인 및/또는 좋은 아이디어입니까? 이 데이터를 모델링 할 때 모범 사례가 있습니까?

미리 감사드립니다.

+0

당신이 생각 것을 클래스 구조를 더 자세히 설명해 주실 수 있습니까? –

+1

"모든 논리적"키 "를 하나로 묶는 맞춤 클래스 목록"이것이 가장 깨끗한 해결책입니다. 느슨한 유형의 사전과 튜플을 사용하지 않아도되도록 약간의 코드가 앞에 있습니다. –

+0

@DStanley 제안에 감사드립니다. 'int'와는 반대로 객체를 사전에 키워 두었다면 많은/성능 저하가 있는지 알고 있습니까? 아니면 equals()를 오버라이드 (override)하는 방법에 정말로 미치지 않습니까? – Xedni

답변

0

이렇게 논란의 여지가 있지만이 접근법이 얼마나 적합한 지 알기 위해이 버전을 토론에 사용하고 싶습니다.

당신이 그룹과 이벤트 유형의 수백만이없는 가정하면,이 비트 DB 측면에서 복합 키의 종류에 그 팩을 수있는 이동 :

public static int Combine(int value1, int value2) 
{ 
    return value1 | (value2 << 8); 
} 

그런 다음 Dictionary<int, string>이 잘 작동 될 것입니다.

dictionary.Add(Combine(UserGroupID, EventTypeID), NameToReplace) 

그리고 값을 얻을 :

dictionary[Combine(UserGroupID, EventTypeID)] // Or TryGetValue()