3

사용자가 미니 데이터베이스를 만들 수 있도록 iPhone 앱에서 작업하고 있습니다. 사용자는 사용자 정의 데이터베이스 스키마를 생성하고 표준 데이터 유형 (예 : 문자열, 숫자, 부울)뿐만 아니라 객체 및 데이터 유형의 모음 (예 : 숫자 배열)과 같은 다른 복합 유형을 가진 열을 추가 할 수 있습니다.동적 데이터베이스를 만드는 iOS 앱의 핵심 데이터 관리 객체 모델 설계

예를 들어, 사용자는 자신의 식사를 기록하기위한 데이터베이스를 만들 수 있습니다.

식사 데이터베이스 :

[ 
    { 
    "timestamp": "2013-03-01T13:00:00", 
    "foods": [1, 2], 
    "location": { 
     "lat": 47.253603, 
     "lon": -122.442537 
    } 
    } 
] 

식사 - 음식 데이터베이스 :

[ 
    { 
    "id": 1, 
    "name": "Taco", 
    "healthRating": 0.5 
    },{ 
    "id": 2, 
    "name": "Salad", 
    "healthRating": 0.8 
    } 
] 

이 같은 응용 프로그램에 대한 데이터베이스를 구현하는 가장 좋은 방법은 무엇입니까?

사용자가 위의 예에서와 같이 새 데이터베이스 스키마를 생성

Core Data Object Model

, 정의 테이블이 다음과 같이 표시됩니다


나의 현재 솔루션은 응용 프로그램에 대해 다음 데이터베이스 스키마를 만드는 것입니다 이 : 사용자가 데이터베이스를 채 웁니다

+----+-----------+--------------+------------+-----------------+ 
| id | parent_id |  name  | data_type | collection_type | 
+----+-----------+--------------+------------+-----------------+ 
| 1 |   | meal   | object  |     | 
| 2 |   1 | timestamp | timestamp |     | 
| 3 |   1 | foods  | collection | list   | 
| 4 |   1 | location  | location |     | 
| 5 |   | food   | object  |     | 
| 6 |   5 | name   | string  |     | 
| 7 |   5 | healthRating | number  |     | 
+----+-----------+--------------+------------+-----------------+ 

, 기록 테이블은 다음과 같이 표시됩니다

이 방법에 대한 16,
+----+-----------+---------------+------------------------+-----------+-----+ 
| id | parent_id | definition_id |  string_value  | int_value | ... | 
+----+-----------+---------------+------------------------+-----------+-----+ 
| 1 |   |    1 |      |   |  | 
| 2 |   1 |    | 2013-03-01T13:00:00 |   |  | 
| 3 |   1 |    2 |      |   1 |  | 
| 4 |   1 |    2 |      |   2 |  | 
| 5 |   1 |    4 | 47.253603, -122.442537 |   |  | 
+----+-----------+---------------+------------------------+-----------+-----+ 

자세한 내용 :

  • 값 다른 데이터 유형은 기록 테이블의 다른 컬럼에 저장됩니다. 값을 올바르게 파싱하는 것은 앱에 달려 있습니다 (예 : timestamp int_value를 날짜 객체로 변환).

  • 제약 조건 및 유효성 검사는 데이터베이스 수준에서 불가능하므로 앱에서 수행해야합니다.

이 접근법의 다른 단점은 무엇입니까? 더 좋은 해결책이 있습니까?

+0

)을 사용하는 것이 더 적합 할 수 있습니다. "EAV"검색. 힌트 : "사용자는 사용자 정의 데이터베이스 스키마를 만들 수 있습니다". 그래서 당신은 * a * data * * base *를 관리하는 시스템을 무엇이라고 부릅니까? 그렇다면 응용 프로그램은 무엇입니까? 그러면 어떻게 그 fuctionality에 대한 코드를 작성하는 것을 피할 수 있습니까? – philipxy

+0

핵심 데이터가 데이터베이스가 아니므로이를 사용하려고하면 Pit of Despair가 발생합니다. – quellish

+0

@quellish 나는 핵심 데이터가 SQLite (스토어로 선택된 경우) 위에 추상 레이어처럼 작동한다는 것을 알고 있습니다. SQLite에서 Core Data를 사용하는 대신 더 좋은 방법은 무엇입니까? –

답변

0

우선 Record 테이블은 매우 비효율적이며 다소 힘들다. 대신 지원해야하는 각 레코드 유형에 대해 별도의 레코드 테이블을 가질 수 있습니다. 새로운 레코드 유형에 대한 지원을 도입하는 데 문제가되지 않기 때문에 모든 것을 단순화하고 유연성을 추가 할 것입니다. 그와

enter image description here

은 우리가 시스템이 작동 할 수 있도록하는 기본 테이블 관리를하기에 충분합니다 결론을 내릴 수 있다고 말했다되고. 당연히, ALTER TABLE 명령이 :

enter image description here

하지만, 어떤 경우에는 매우 비쌀 수 있으며 일부 엔진은 여러 가지 한계가있다. 예 :

SQLite는 제한된 ALTER TABLE 하위 집합을 지원합니다.SQLite의 ALTER TABLE 명령을 사용하면 사용자가 테이블의 이름을 바꾸거나 새로운 열을 기존 테이블에 추가 할 수 있습니다.

또 다른 접근법은 레코드 값을 저장하기 위해 일부 유형 태그와 함께 BLOB를 사용하는 것입니다.

enter image description here

이 방법은 별도의 테이블을 지원해야 할 필요성을 줄일 수 있습니다. 그것은 우리를 Schemaless approach로이 끕니다.

+0

각 레코드 유형에 대해 별도의 테이블을 만드는 것이 좋습니다. 감사합니다. Schemaless 데이터베이스는 흥미롭지 만 iOS에는 괜찮은 솔루션이 있습니까? –

+1

스키마가 문제를 해결할 경우 모든 플랫폼에서 괜찮습니다. 나는 단순화 된 디자인이 모바일 플랫폼에 더 환영한다고 말하고 싶다. BTW에는 잠재적 인 이점을 이해하는 데 도움이되는 NanoStore 솔루션 (https://github.com/tciuro/NanoStore)이 있습니다. –