2014-05-20 1 views
1

루비 온 레일즈 (Ruby On Rails)를 사용하여 다중 온도 곡선을 저장하는 가장 좋은 방법은 무엇이고 SQL- 데이터 베이스. 온도 곡선은 동시에 측정됩니다. 그리고 측정 된 값의 시간은 초 단위로 저장됩니다.레일즈와 SQL을 사용하여 여러 온도 곡선 (동시에 측정되는)을 데이터베이스에 저장하는 가장 좋은 방법은 무엇입니까

이 피케트는 내 문제를 UML로 보여줍니다. 그러나 타임 라인과 곡선 측정 사이의 연관성은 올바르지 않습니다. 각 타임 라인 값은 여러 곡선 - 측정을 가질 수 있지만 같은 곡선이 아닙니다. 타임 라인과 동일한 곡선에서 값은 고유해야합니다.

Pic 1

이 솔루션의 모든 타임 라인 값은 몇몇 곡선 지표를 가질 수있다. 이것은 정확하지 않지만이 그림에서 타임 라인 값은 동일한 곡선에 여러 곡선 모서리가있을 수 있으며 잘못되었습니다.

Pic 2

난 당신이 내 문제를 이해하고 더 나은 방법으로 나에게 약간의 힌트를 줄 수 있기를 바랍니다. 이것은 당신이보다 더 가질 수 없도록합니다 - 귀하의 요구 사항에 중요한 부분이 CurveMeasurement 모델의 고유성 범위가

class Curve < ActiveRecord::Base 
    has_many :curve_measurements 
    ... 
end 

class Timeline < ActiveRecord::Base 
    has_many :curve_measurements 
    ... 
end 

class CurveMeasurement < ActiveRecord::Base 
    belongs_to :curve 
    belongs_to :timeline 

    validates :curve_id, uniqueness: { scope: :timeline_id } 
    validates :timeline_id, uniqueness: { scope: :curve_id } 
    ... 
end 

: 당신의 Curve 사이 Timeline 조인해야 CurveMeasurement처럼

+0

실제로 처음부터 automomus 개념으로 타임 라인의 요점은 무엇입니까? "value"이외에 각 CurveMeasurement 인스턴스에 간단한 타임 스탬프를 추가하는 것으로 충분하지 않습니까? 올바른 결과를 얻을 수있는 경우 일부 측정은 특정 시점에 캡처되어 곡선에 할당됩니까? 이 곡선은 시각화 도구입니까? 나는 여기에서 또 하나의 문제는 관계의주기적인 특성과 그것이 야기하는 모든 문제 (중복성과 복잡한 유지 보수성)라고 생각한다. 그리고 finnaly - Dataset은 무엇을 의미합니까? 나는 완전히 다른 추상화 수준에있다. – Aleks

답변

2

은 같습니다 주어진 타임 라인 지점에서 주어진 곡선에 대해 하나의 측정.


또한 타임 라인 값은 별도의 모델없이이 작업을 수행 할 수있을 것입니다 : 당신이 timeline_value s의 개별 설정을 적용하고 싶다면 당신은 더 검증을 사용할 수

class Curve < ActiveRecord::Base 
    has_many :curve_measurements 
    ... 
end 

class CurveMeasurement < ActiveRecord::Base 
    belongs_to :curve 

    validates :timeline_value, uniqueness: { scope: :curve_id } 
    ... 
end 

: 중 numericality 또는 inclusion (http://guides.rubyonrails.org/active_record_validations.html 참조)

1

정확하게 이해하면 주어진 곡선에 대한 측정 값은 특정 시간에 측정 된 값입니다. 그리고 언제든지 모든 곡선에 대해 모든 값을 찾을 수 있기를 원합니다.

동시에 커브 당 시간당 측정 만 가능하기를 원합니다. 두 번째 모델에서도이를 구체적으로 수행 할 수 있습니다.

t.curve_id 
t.timeline_id 
t.value 

그런 다음 (제약 조건을 지정하여 데이터베이스에 의존 할 수처럼 모델에서

, 당신의 curve_measurements는 조합 curve_id, timeline_id 괜찮을하는 것을 보일 것이다.

하나의 경이로움을, Timeline 경우 몇 초 만에 시간을 제공 할뿐 아니라 간접적 인 수준을 떨어 뜨리지 않는 이유는 무엇입니까?

Timeline이있는 경우 그냥 timeline.curve_measurements를 기록 할 수 있지만이 일정 테이블의 필요성을 삭제하고 바로 curve_measurements 테이블에 직접 값을 시간 (또는 타임 라인)를 추가하면, 테이블이

처럼 보일 것입니다, 부여 다음
t.curve_id :integer, references: curves 
t.measured_at :time 
t.value 

및 는 (하나의 작은 참여) 조회하기 쉽다 CurveMeasurement.where(:measured_at => ....)

쓰기, 특정 시간에 모든 측정 값을 얻을 수 있습니다. 또한 곡선마다 측정 만 수행되도록하려면 curve_id, measured_at 조합이 고유해야한다는 것을 지정하여 비슷한 제한 조건을 추가하기 만하면됩니다.

관련 문제