2014-08-27 1 views
0

새로운 iOS 앱에 대한 데이터 모델의 대부분을 알아 냈으니 잠시 생각해 본 문제에 봉착했습니다.NULL 값이없는 데이터베이스 디자인 및 iOS App 용 데이터 반복

'실험'에는 이름, 설명 및 소유자가 있습니다. 그것은 또한 하나의 '행동'과 하나의 '사건'을 가지고 있습니다.

'이벤트'는 시간, 위치 또는 속도와 다를 수 있습니다.

'이벤트'의 종류에 따라 '유형'이 다를 수 있습니다. 예를 들어 시간은 일회성, 간격, 날짜 범위, 반복 또는 임의 일 수 있습니다. 위치는 지역 또는 정확한 위치 일 수 있습니다.

각 '유형'에는 고유 한 데이터 형식이있는 값이 있습니다. Time One-Off는 12:15 pm의 날짜 값일 수 있으며 Location Exact는 (30.0, -20.0)의 GeoPoint 값일 수 있습니다. 데이터베이스가 NULL 값으로 을 가득되지 않도록

문제는

  • 어떻게 데이터 모델을 설계 할 수 있습니까?
  • '이벤트' 및 '유형'을 추가하면 데이터 모델을 확장 가능하도록 디자인하는 방법은 무엇입니까? 실험으로 생각

만이 NULL의 전체로 실험 테이블을 야기하지만 그렇게하지, 다른 테이블에이 두 가지를 분리하는 잘못된 행동과 하나의 이벤트가 될 것있다 값, 이벤트 유형, 이벤트 유형 및 이벤트 유형 값 중 하나를 입력 할 수있는 모든 가능한 데이터 유형을 보완하기 위해 컬럼을 가져야합니다.

이벤트와 이벤트 유형을 별도의 테이블로 구분하면 NULL 값 문제가 해결되지만, 특히 데이터가 반복되는 경우에는 반복되는 데이터로 수정 될 수 있습니다 (예 : 날짜, 정수, 문자열, geopoint 등). Type One-Off 이벤트는 12:00 pm과 같은 이벤트입니다. 다른 하나의 실험뿐만 아니라 다른 실험에서도 마찬가지입니다. (비록 내가 모든 가능성을 창조하고 이들과 함께 별도의 표를 채우지 않는 한, 어떻게하면 쉽게 이럴 수 있겠습니까?)

어쩌면 제가 복잡한 일을 끝내고 있습니다. 내가 그것을 볼 때 자신.

답변

1

테이블이 아닌 개체 측면에서 데이터 모델을 고려해야합니다. 핵심 데이터는 객체 그래프와 함께 작동하므로 핵심 데이터의 모든 것이 객체입니다. Objective-C에서는 객체로 작업합니다. 이것이 ORM 도구가 필요없는 이유입니다. 당신이 사물의 관점에서 생각한다면, 나는 아래의 모델이 분명히 효과가 있다고 생각하지만, 당신은 그 점을 이해해야한다고 생각합니다. 이와 같은 개념으로 개념을 분리하는 것의 이점은 여러 각도에서 문제를 볼 수 있다는 것입니다. 즉, 실험 각도 또는 이벤트 각도에서 볼 수 있습니다. 일정에 표시하거나 미리 알림을 설정하기 위해 코드에서 Time 개체를 사용하는 것과 같은 데이터를 사용하여 작업을 수행하려고합니다. 특정 유형의 모든 실험에 대한 모든 이벤트를 가져옵니다. 이러한 데이터 항목을 핵심 데이터의 객체에 캡슐화하면 코드에서 활용하고 조작하고 수정할 수있는 모든 준비가 완료됩니다. 또한 사용자가 식별 한 Null 값 문제를 제거합니다. null 값에 대한 개체를 만들지 않으므로 실험과 관련된 값에 대해서만 만듭니다. 즉, 프로그램의 특성에 따라 모델을 더 자세히 분석 할 수 있습니다. 또한 올바르게 설계하면 반복되는 데이터 문제가 발생하지 않습니다. 다시 말하지만, 객체를 다루는 테이블의 행은 다루지 않습니다."일회용 12:00 pm"으로 이벤트 유형 개체를 만드는 경우 해당 이벤트 유형 개체를 해당 관계를 통해 원하는만큼의 이벤트에 할당 할 수 있습니다. 개체를 다시 만들지 않고 간단하게 개체를 참조하십시오. 관계를 생각할 때 "X는 Y와 연관 될 수 있습니다"라고 생각하십시오. 예를 들어 "실험은 단 하나의 이벤트와 연관 ​​될 수 있습니다", "이벤트 유형은 많은 이벤트와 연관 ​​될 수 있습니다", "이벤트는 단 하나의 이벤트 유형과 연관 될 수 있습니다." 이 접근 방식을 사용하면 길 아래로 확장 성을 확보 할 수 있습니다. 새로운 이벤트 유형을 추가한다고 가정 해보십시오. 새 이벤트 엔티티를 만들고 이벤트 유형 엔티티에 연결하기 만하면됩니다.

내 제안은 코드에서 개체를 사용하는 방법과 쿼리를 통해 개체에 액세스하는 방법을 기준으로 개체 모델을 생각하는 것입니다. 이를 통해 사용자가 어떻게 구성 하는지를 파악할 수 있습니다 (예 : 시간 개체가 필요한 경우 개체 모델에 해당 개체가 있는지 확인해야합니다. 경고 개체가 필요한 경우 개체 모델에 해당 개체가 있는지 확인해야합니다). 모델이 당신을 위해 작업을 수행하고 objective-c 내에 객체 모델과 동등한 코드를 작성하지 않거나 코드에서 객체를 생성하고 데이터 저장소의 데이터로 채우는 것을 시도하지 마십시오.

(편집 : 시간 아래 그림의 "이벤트"관계를 바꾸기 "이벤트 유형"에 위치 & 속도) enter image description here

+0

위즈 키드가, 감사합니다, 그 그림은 큰 도움이됩니다. 한 가지 - EventType은 전체 유형이 아닌 하나의 유형 만 가질 수 있습니다. 그래서 시간, 위치 또는 속도. – jcrowson

+0

멋진데. 이벤트 유형이 단순한 이름 (예 : 목록) 이상인 경우 모델에서 개체를 개체로 나타내려고 할 수 있습니다. 당신이 말한대로 그 확실한 그 3 개의 실재물을 떨어 뜨리고 당신은 좋아야한다. 내가 생각한 방식은 이벤트가 3 가지 매우 다른 이벤트 유형 중 하나와 연관 될 수 있다는 것입니다. 이벤트 유형 엔티티는 시간, 위치, 속도가 해당 오브젝트와 관련된 세부 사항을 보유하는 동안 유형에 대한 설명 정보를 보유합니다 (예 : 시간 : 날짜, 시간, 시간 범위, 시간대 등). 행운을 빕니다. – Wizkid

+0

물건은 - 나는 그들이 물건으로서 더 좋다고 생각한다. 문제는 NULL 값을 만들지 않고 세 객체와 Event Type 객체 사이의 관계를 만드는 것입니다. 단 하나만 필수이므로 다른 두 객체는 ​​NULL입니다. 두 개의 더 많은 NULL 포인터가 없어도 Event Type 개체에서 단 하나의 개체 만 참조하려면 어떻게해야합니까? – jcrowson