2012-11-21 2 views
6

필자의 경우 RDBMS, MySql을 사용하여 통화 환율 크로스 테이블 값 (예 : http://www.exchangerates.org.uk/currency/currency-exchange-rates-table.html)을 저장해야합니다.환율 계산기 디자인 및 저장 Cross Table

사용자는 매일 수치를 업데이트하고 시스템은 다른 버전을 저장합니다.

테이블을 어떻게 디자인 할 것인지, 모델을 원한다면 궁금합니다.

가장 간단한 방법은에에서있는 테이블을 사용하여, 물론이고 열

from: char(3) 
to: char(3) 
value: decimal(6,4) 
inverse_value: decimal(6,4) 

값하지만 난 다른 (더 나은) 솔루션이 있는지 알고 싶어요.

고마워요.

편집

분명히 아니었다면 나는 사과하지만 성능과 확장 성에서 특히 관심이 있어요.

Currency/Cross Cross Table은 value/inverse_value 구조와 90 개의 통화를 유지하면서 하루에 4,050 개의 레코드가 필요합니다.

매일 새 버전이 생성되면 1 년 내에 1,478,250 개의 레코드가 있고 쿼리는이 될 수 있습니다.

테이블을 구현 했으므로 크로스 테이블 렌더링 속도가 매우 빠르며 잘 작동합니다.

이것을 구현하는 더 좋은 방법이 있는지 궁금합니다.

+2

음,에서와 필드에 대해 조금 조심 것입니다. char (3)이 어떤 디스플레이에서 사용될 것이라면 다른 id를 연결해야 할 수도 있습니다 (디스플레이가 바뀌면 인덱스를 엉망으로 만들고 싶지는 않습니다). 저쪽에 ... 값은 무엇이고 inverse_value는 무엇입니까? 나는 개인적으로에서,를 사용하고 싶습니다. – RonaldBarzell

+0

예, 스키마는 단순화 된 버전이었습니다. 제 경우에는 정수 ID가있는 통화에 대한 추가 테이블이 있습니다. 또한 수치가 다를 수 있기 때문에 inverse_value가 필요합니다. –

+0

답변 중 하나를 가리키는 기회가 있습니까? – Ewen

답변

3

좋은 시작처럼 보입니다.이 값을 매일 업데이트하는 경우 datetime 필드가 아닌 날짜 필드도 추가됩니다. 이 같은 아마 뭔가 :

currency_code_from: char(3) 
currency_code_to: char(3) 
conversion_value: decimal(6,4) 
inverse_conversion_value: decimal(6,4) 
effective_date: date() 

나는이 색인 요구 사항을 지시 할 것입니다,하지만 난 아마 currency_code_from에 걸쳐 복합 기본 키를 사용 하듯이 테이블을 조회 할 계획이다 다양한 방법이 무엇인지 확실하지 않다 , currency_code_toeffective_date 필드를 입력 한 다음 특정 검색어에 필요한 모든 색인을 추가하십시오.

currency_code: char(3) 
currency_name: varchar(50) 
currency_symbol: char(3) 
currency_image: varchar(100) 

디스플레이에 필요한 경우 당신은 그와 관련하는 추가 테이블이 할 수

는 통화 및 통화 기호의 이름을 저장 은 (당신이 것을 사용하려는 경우도 아마 국가 플래그 이미지에 링크)

이 테이블의 기본 키는 currency_code입니다.

2

Marco, 최신 ccy 변환을 선택할 수 있도록 날짜 필드와 부울 isCurrent가 필요할 것입니다.

숫자를 사고 사고 싶습니까? 일반적으로 조직을 잃지 않도록 ccy의 구매와 판매 사이에 약간의 단서가 있는지 확인하십시오. 이를 다른 사람들이 일부러 고의적 인 방법으로 감각적 인 비즈니스 접근 방식이라고합니다.

이 수치를 수동으로 입력 한 경우 통화의 이전 그림을 확인하고 불일치가 3 %를 넘는 경우 사용자에게 경고하십시오.

유일한 다른 문제는 하루 동안 환율이 크게 변동하는 경우입니다. 당신은 전쟁 선포 이전에 단지 하나의 전환으로 고착되고 싶습니까?

옳은 길을 걷고있는 것처럼 보입니다.

+0

예, 구매/판매 수치입니다. 나는 클라이언트가 사물을 단순화하기 위해 수동으로 값을 입력 할 것이라고 말했다. 실제로 그는 내부 도구로 자동 생성 된 Excel을 업로드 할 예정입니다. –

2

개인적으로 "자연"키를 사용하지 않습니다.

country 
------- 
country_id : integer not null auto_increment 
name : varchar(255) 
abbrev : varchar(255) 
motto : varchar(255) 
. . . 

다음 크로스 탭에있는 사람들을 위해 ID를 사용합니다 :

currency_exchange 
----------------- 
currency_exchange_id : integer not null auto_increment 
from_country_id : integer 
to_country_id : integer 
value : decimal(10,4) 
inverse_value : decimal(10,4) 

을이 날 심볼에 국가의 이름을 변경할 수 있습니다 대신, 국가/통화 가지는-엔티티의 테이블이 , 크로스 탭 테이블의 정의를 변경하지 않고도 전체 이름을 사용할 수 있습니다. 전환 값을 쿼리 할 때 두 테이블을 결합하십시오.

또한 10 진수 (10,4)로 가고 가능한 최대를 찾아 볼 것을 권합니다. 크기를 제한하고 나중에 너무 작은 크기를 선택했음을 발견하는 것은 프로그래밍 업데이트의 골치 거리가되지 않습니다. 이러한 버그를 처리하는 데 충분한 공간을 차지하지 않습니다. 이름에 사용하는 varchar와 동일합니다. Varchars는 효율적으로 저장됩니다.

또한 value은 항상 1.00이 아니십니까? (즉, 항상 1에서 다른 역으로 역변환하지 않습니까?) 그렇다면 value 열을 테이블에서 삭제할 수 있습니다.

필자는 개인적으로 모든 테이블에 ID 값을 생성하는 것을 좋아하므로 크로스 탭에 하나씩 넣는 것이 좋지만 일부 사람들은 불필요하다고 제안 할 수 있습니다. 나는 종종 나중에, 내가 그것을 버렸을 때, 내가 그것을 더하고 싶었던 것을 발견한다.

나는 통화의 이름을 다른 테이블을 가지고 볼 수 있습니다 :

currency 
-------- 
currency_id : integer not null auto_increment 
country_id : integer 
name : varchar(255) 
symbol : varchar(255) 
+0

나는 동의한다, 나는 자연의 열쇠도 좋아하지 않는다. 내 것은 단순한 버전이었다. 실제로 퍼포먼스와 확장성에 관심이 있었기 때문에 포스트를 더 명확하게하려고 업데이트했습니다. 또한 값은 항상! = 1이지만 이론적으로는 1/값이어야하는 inverse_value는 구매/판매 특성으로 인해 다를 수 있습니다. 마지막으로 십진법에 대한 감사의 말, 그것은 확실히 좋은 지적입니다! –

+0

Re : performance, 등등. 한 번 비슷한 크로스 탭 (게임 상대를 죽이는 횟수)이있었습니다. 이것은 정확히 내가 생각해 낸 것입니다. 잘 작동합니다. – Marvo