2010-08-21 5 views
0

나는 훈련 프로그램과 관련된 몇 가지 응용 프로그램을 만들고 있습니다.데이터베이스 문제, 변화하는 데이터 구조를 저장하는 방법

3 sets of 45 push ups. 

그래서 난 그냥이 개 필드 세트를 만들 것입니다/

하지만 운동도 수를 계산 : 내 문제는

운동이 간단 할 수있다, 이렇게 있습니다 :

45 minutes run, 3 sets of 45 pushups, 2 minutes of rope jumping, 150 meter swimming. 

그래서 구조를 변경하면 데이터를 저장한다는 것을 알 수있는 하나의 테이블을 작성해야합니다. 나는 그것을 gui의 실제 데이터로 변환 할 수 있습니다.

어떻게 효율적이고 현명하게 만들 수 있습니까?

편집 :

, 그것은 조금 분명 내가 필자는 거기에 무슨 짓을 각 운동에 지정하려는 을 확인하십시오. 그래서 한 운동을 할 수있다 : 3 세트 제 45 펴기 제 32 펴기 제 30 펴기

다른 운동이 될 수있다 : 알몸의 3 세트 : 제 45 푸시 제 UPS 32 펴기 제 을 30 펴기 로프 150m 수영을

데이터 점프도 로 2 분 일관성없는 한 세트 펴기의 수가 될 수 앞으로있을 시간 길이 등이되어야합니다.

+0

나는이 문제를 이해하지 못한다. 45 푸시 업 3 세트로 왜 두 개의 파일이 생성됩니까? 파일로 무엇을 의미합니까? 데이터가 필요한 구조는 무엇입니까? –

+0

죄송합니다. 필드를 의미했습니다. – WEBProject

+1

테이블이 하나 여야합니까? 이것은 나에게 여러 개의 테이블을 비명 ... – Stephen

답변

1

나는 1 : n 관계에 대해 말하고 싶습니다. 여기에는 마스터 "운동"테이블이 있으며, 운동의 모든 활동을 포함하는 통일 된 "구성 요소"테이블이 있습니다.

당신은 당신의 기본 테이블 workouts이있을 것이다 :

id int 
participant varchar(255) 
date  datetime 
...... any other workout related data 

그런 자식 테이블 workout_components :

workout_id int   // Which workout this belongs to 
tabindex int   // Which sorting order this component has in the list 
repeat  int   // Number of repetitions (e.g. 3 sets) 
quantity int   // e.g. 45 push-ups or 150 meters of cycling 
quentity_unit varchar // e.g. minutes or laps 
activity varchar  // push-ups, cycling ..... 

예를 들어 값이 같을 것이다 :

운동 테이블 :

id   participant  date 
1   Harry Miller  2010-08-21 

workout_components 테이블 :

workout_id tabindex  repeat  quantity  quantity_unit activity 
1   1   3   45   pcs   pushups 
1   2   1   2   minutes  rope-jumping 

장점 :

  • 는 쿼리

  • 쉬운 특정 활동에 국한되지 않음 - 데이터 구조가 이런 종류의에서 무언가를 얻는 방법에 관한 모든 질문 이미 답변을 받았습니다.

  • 활동을 자유롭게 추가 할 수 있습니다. 각 운동에

+0

는 괜찮은 것 같습니다.하지만 각 운동 5 구성 요소와 100 개의 운동이 있다고 말하는 것은 비효율적이지 않습니까? – WEBProject

+1

@WEB 프로젝트는 어떤면에서 비효율적입니까? 스크립트 또는 데이터베이스를 의미합니까? 걱정마. 최신 하드웨어는 눈 깜짝 할 사이에 수조 행 처리를 위해 제작되었습니다. 이와 같이 관리 할 가능성이있는 데이터의 양은 성능을 최적화하기 위해 비정규 화에 대한 생각을 정당화하는 것과는 거리가 멀습니다. –

+0

, 감사합니다. 당신은 매우 도움이되었습니다. – WEBProject

1

다음 열이 포함 된 테이블을 만들 수 있습니다. WorkoutType | 세트 | 가치 | ValueType.

---------------------------------- 
WorkoutType | Sets | Value | ValueType 
---------------------------------- 

Pushups  | 3 | 45 | nos 
Run   | null | 45 | minutes 
Rope Jumping | null | 2 | minutes 
Swimming  | null | 150 | meter 
+0

문제는 그게 많은 데이터라는 것, 나는 각 연습마다 흩어져있는 100 개의 운동, 많은 데이터를 가지고 있다고 말할 수있다. – WEBProject

+0

데이터 자체 (세트, 값 등)를 하나의 테이블에 저장하는 방법이 필요합니다. – WEBProject

1

당신은 데이터베이스 스키마를 고려하는 것이 좋습니다처럼 그래서 당신은 다음과 같은 저장할 수 있습니다 :이 이전 운동의 스키마를 따르지 않는 복잡한 운동을 할 수 있습니다

CREATE TABLE workouts (
    workout_id int, 
    user_id  int, 
    PRIMARY KEY (workout_id) 
) ENGINE=INNODB; 

CREATE TABLE sessions_pushups (
    started  datetime, 
    workout_id int, 
    number  int, 
    PRIMARY KEY (started, workout_id), 
    FOREIGN KEY (workout_id) REFERENCES workouts (workout_id) 
) ENGINE=INNODB; 

CREATE TABLE sessions_rope_jumping (
    started   datetime, 
    workout_id  int, 
    duration_minutes int, 
    PRIMARY KEY (started, workout_id), 
    FOREIGN KEY (workout_id) REFERENCES workouts (workout_id) 
) ENGINE=INNODB; 

CREATE TABLE sessions_swimming (
    started datetime, 
    workout_id int, 
    meters  int, 
    PRIMARY KEY (started, workout_id), 
    FOREIGN KEY (workout_id) REFERENCES workouts (workout_id) 
) ENGINE=INNODB; 

.

CREATE TABLE sessions_triathlon (
    started   datetime, 
    workout_id   int, 
    swimming_meters int, 
    cycling_meters  int, 
    running_meters  int, 
    duration_minutes int, 
    PRIMARY KEY (started, workout_id), 
    FOREIGN KEY (workout_id) REFERENCES workouts (workout_id) 
) ENGINE=INNODB; 

Martin Fowler calls the above model "콘크리트 테이블 상속"그의 Patterns of Enterprise Application Architecture 책 : 당신은 아주 쉽게 이런 식으로 뭔가를 할 수있다. Bill Karwin도 그의 SQL Antipattens 서적의 Entity-Attribute-Value 장에서이 모델을 설명합니다. 그는 또한 그러한 시나리오를 해결하기 위해 EAV 모델을 선택할 때의 단점을 설명합니다.

반면에 전체 스키마 유연성을 원한다면 MySQL 대신 다른 NoSQL 솔루션을 고려해 볼 수 있습니다. 이러한 데이터 저장소에는 일반적으로 고정 테이블 스키마가 필요하지 않습니다.

+1

좋은 것이지만 내일 새로운 운동이 도입되면 새로운 테이블을 생성해야합니다. 모든 운동에 대해 새 테이블을 만들어야합니다. – Chinjoo

+0

사실, 각 회원은 자체 "세션"을 만들 수 있습니다. 왜 데이터를 저장하는 창의적인 방법이 필요한가요? – WEBProject

+0

@Chinjoo : 예, SQL은 이러한 상황에서 가장 잘 작동합니다. 제안한 EAV 모델은 해결책이 될 수 있지만 특정 단점이 있습니다. 주로 데이터 무결성을 적용하기가 어렵고 특정 쿼리를 작성하기가 매우 어려워집니다. (데이터베이스가 의미가 없더라도 300 밀리미터의 푸시 업을 삽입하는 것을 멈추지는 않습니다.) –

관련 문제