2012-11-21 11 views
6

Potrzebuję przechowywać wartości tabeli krzyżowej kursów wymiany walut (np. http://www.exchangerates.org.uk/currency/currency-exchange-rates-table.html) za pomocą RDBMS, MySql w moim przypadku.Projektuj i przechowuj kursy wymiany walut Tabela krzyżowa

Użytkownik codziennie będzie aktualizował dane, a system będzie zapisywać różne wersje.

Zastanawiam się, jak zaprojektować stoły lub jeśli chcesz modeli.

Najprostszym sposobem jest, oczywiście, stosując tabelę z, do i wartości kolumn

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

ale chciałbym wiedzieć, czy istnieją inne (lepsze) rozwiązania.

Wielkie dzięki.

EDIT

przepraszam jeśli nie było jasne, ale jestem szczególnie zainteresowany występów i skalowalności.

Utrzymując strukturę wartość/inverse_value i biorąc pod uwagę 90 walut, tabela krzyżowa wymiany walut wymagałaby 4 050 rekordów dziennie.

Jeśli nowa wersja jest tworzona każdego dnia, w ciągu jednego roku pojawi się 1 478,250 rekordów, a zapytania będą mogły cierpieć na.

Zaimplementowałem tabelę i działa dobrze, renderowanie tabeli krzyżowej jest dość szybkie i jestem z niej zadowolony.

Po prostu zastanawiałem się, czy istnieje lepszy sposób realizacji tego.

+2

Cóż, byłbym nieco ostrożny o zi na polach. Możesz chcieć, aby inny identyfikator był połączony z char (3), jeśli ma być użyty na jakimkolwiek wyświetlaczu (nie chcesz zepsuć indeksu, jeśli twój wyświetlacz się zmieni). Poza tym ... po co są wartości i inverse_value? Osobiście po prostu używam, od, i oceniam. – RonaldBarzell

+0

Tak, schemat był tylko uproszczoną wersją, w moim przypadku mam dodatkową tabelę dla walut z liczbami całkowitymi. Również wartość inverse_value jest potrzebna, ponieważ liczby mogą być różne. –

+0

Czy istnieje szansa na przyznanie punktu jednej z odpowiedzi? – Ewen

Odpowiedz

3

To wygląda na dobry początek, dodałbym również pole daty (zamiast pola daty i godziny, jeśli aktualizuje się te wartości codziennie). Więc może coś takiego:

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

Nie jestem pewien, co różne sposoby Planujesz kwerendy tabeli są, jak to będzie dyktować swoje wymagania indeksu, ale to pewnie użyć związek klucz podstawowy poprzek currency_code_from , currency_code_to i effective_date, a następnie dodaj indeksy zgodnie z wymaganiami dla określonych zapytań.

wtedy może chcieć mieć dodatkową tabelę, aby odnosić się do, która przechowuje nazwę waluty i symbol waluty, jeśli potrzebne do wyświetlania (być może także odwołują się do flag kraj obrazu, jeśli chcesz używać tego)

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

Kluczem podstawowym w tej tabeli będzie currency_code.

2

Marco, Prawdopodobnie potrzebne będzie również pole daty lub boolean isCurrent, dzięki czemu można wybrać najnowszą wersję konwersji.

Czy chcesz mieć dane kupna i sprzedaży? Zwykle upewniasz się, że istnieje pewna przewaga między kupnem a sprzedażą ccy, aby upewnić się, że organizacja nie przegrywa. Jest to nazywane rozsądnym podejściem biznesowym przez niektórych i żonglowaniem przez innych.

Jeśli wartości te są wprowadzane ręcznie, należy sprawdzić poprzednią wartość waluty i jeśli występuje rozbieżność> 3%, należy ostrzec użytkownika.

Jedyną inną kwestią jest sytuacja, gdy kursy wymiany zmieniają się znacznie w ciągu dnia. Czy chcesz utknąć z jedną konwersją przed ogłoszeniem wojny?

Pojawia się, że jesteś na dobrej drodze.

+0

Tak, to są dane kupna/sprzedaży. Powiedziałem, że klient będzie wprowadzał wartości ręcznie tylko dla uproszczenia rzeczy. W rzeczywistości prześle program Excel generowany automatycznie przez wewnętrzne narzędzie. –

2

Nie użyłbym osobiście klawiszy "naturalnych". Zamiast tego, mamy tabelę krajów/waluta-mający-podmioty:

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

następnie użyć identyfikatory dla tych w tabeli krzyżowej:

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) 

To pozwala mi zmienić nazwę kraju na symbol , pełna nazwa, cokolwiek, bez konieczności zmiany definicji tabeli tabeli przestawnej. Dołącz do dwóch tabel podczas sprawdzania wartości konwersji.

Udałem się również z dziesiętnym (10,4) i polecam wyszukiwanie maksimum. Nie warto bóle głowy z aktualizacji oprogramowania, aby ograniczyć rozmiar, a później odkryć, że wybrałeś rozmiar, który jest zbyt mały. Nie zajmuje wystarczająco dużo miejsca, aby warto było poradzić sobie z tymi błędami. To samo dotyczy varcharu, którego używasz do nazwy. Varchary są przechowywane efektywnie.

Czy też nie jest value zawsze będzie 1,00? (To znaczy, czy nie zawsze przeliczasz od 1 do jakiejś odwrotności w innej walucie?) Jeśli tak, możesz usunąć kolumnę value z tabeli.

Osobiście lubię generowanie wartości ID na wszystkich tabelach, więc umieszczam jeden na tabeli przestawnej, ale niektórzy mogą sugerować, że nie jest to konieczne. Często znajduję później, kiedy zdecydowałem się go opuścić, żałuję, że go nie dodałem.

widziałem mając innej tabeli nazwy waluty:

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

Zgadzam się, ja też nie lubię kluczy naturalnych, moja była tylko wersją uproszczoną. Zainteresowałem się występami i skalowalnością, zaktualizuję post, starając się być bardziej przejrzystym. Ponadto wartość jest zawsze! = 1, podczas gdy inverse_value, która teoretycznie powinna być równa 1/value, może być inna z powodu natury buy/sell. Na koniec, dzięki za wskazówkę dziesiętną, to zdecydowanie dobry punkt! –

+0

Re: wydajność, itp. Miałem podobną tabelę krzyżową jeden raz (liczba zabójstw między przeciwnikami gry) i to jest dokładnie to, co wymyśliłem. Działa dobrze. – Marvo