2012-11-21 61 views
6

Tôi cần lưu trữ các giá trị của bảng tỷ giá hối đoái chéo (ví dụ: http://www.exchangerates.org.uk/currency/currency-exchange-rates-table.html) bằng RDBMS, MySql trong trường hợp của tôi.Thiết kế và lưu trữ Tỷ giá ngoại tệ Bảng chéo

Người dùng sẽ cập nhật số liệu hàng ngày và hệ thống sẽ lưu trữ các phiên bản khác nhau.

Tôi đã tự hỏi làm thế nào bạn sẽ thiết kế các bảng hoặc nếu bạn muốn các mô hình.

Cách đơn giản nhất là, tất nhiên, bằng cách sử dụng một bảng với từ, đến và đánh giá cao các cột

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

nhưng tôi rất thích biết nếu có khác (tốt hơn) các giải pháp.

Thanks a lot.

EDIT

Tôi xin lỗi nếu đó không phải là rõ ràng nhưng tôi đặc biệt quan tâm trong buổi biểu diễn và khả năng mở rộng.

Giữ giá trị/cấu trúc nghịch đảo và được cung cấp 90 đơn vị tiền tệ, Bảng giao dịch tiền tệ sẽ cần 4.050 bản ghi mỗi ngày.

Nếu phiên bản mới được tạo mỗi ngày, trong một năm sẽ có 1.478.250 bản ghi và các truy vấn có thể bắt đầu bị ảnh hưởng.

Tôi đã triển khai bảng và nó hoạt động tốt, kết xuất bảng chéo khá nhanh và tôi hài lòng với nó.

Tôi đã tự hỏi liệu có cách nào tốt hơn để thực hiện điều này không.

+2

Vâng, tôi muốn có một chút cẩn thận về các từ và đến các lĩnh vực. Bạn có thể muốn một id khác được kết nối với char (3) nếu nó sẽ được sử dụng trong bất kỳ màn hình nào (bạn không muốn làm hỏng chỉ mục của bạn nếu màn hình của bạn thay đổi). Ngoài ra ... giá trị và inverse_value là gì? Cá nhân tôi chỉ sử dụng từ, đến và đánh giá. – RonaldBarzell

+0

vâng, lược đồ chỉ là một phiên bản đơn giản, trong trường hợp của tôi, tôi có thêm một bảng cho các loại tiền tệ có id nguyên. Ngoài ra, inverse_value là cần thiết vì các số liệu có thể khác nhau. –

+0

Bất kỳ cơ hội nào có thể trao điểm cho một trong các câu trả lời? – Ewen

Trả lời

3

Điều đó có vẻ như là một khởi đầu tốt, tôi cũng sẽ thêm trường ngày (thay vì trường ngày giờ nếu bạn chỉ cập nhật các giá trị này hàng ngày). Vì vậy, có lẽ một cái gì đó như thế này:

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

Tôi không chắc chắn những gì các cách khác nhau mà bạn đang có kế hoạch để truy vấn bảng là, vì điều này sẽ chỉ ra yêu cầu chỉ số của bạn, nhưng tôi có lẽ sẽ sử dụng một khóa chính hợp chất trên currency_code_from , Các trường currency_code_toeffective_date, sau đó thêm bất kỳ chỉ mục nào cần thiết cho các truy vấn cụ thể của bạn.

Sau đó bạn có thể muốn có một bảng phụ liên quan đến lưu trữ tên của tiền tệ và các ký hiệu tiền tệ nếu cần thiết để hiển thị (cũng có lẽ liên kết đến hình ảnh đất nước cờ nếu bạn muốn sử dụng đó)

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

Khóa chính trên bảng này sẽ là currency_code.

2

Marco, Có thể bạn sẽ cần trường ngày hoặc boolean isCurrent để bạn có thể chọn chuyển đổi ccy mới nhất.

Bạn có muốn mua và bán số liệu không? Thông thường, bạn chắc chắn rằng có một chút dẫn đường giữa việc mua và bán ccy để đảm bảo rằng tổ chức không bị mất. Điều này được gọi là một cách tiếp cận kinh doanh hợp lý bởi một số và gouging bởi những người khác.

Nếu các số liệu này được nhập theo cách thủ công, hãy đảm bảo bạn xem xét số liệu trước đó cho đơn vị tiền tệ và nếu có chênh lệch> 3% thì hãy cảnh báo người dùng.

Vấn đề duy nhất khác là khi tỷ giá hối đoái dao động rộng rãi trong ngày. Bạn có muốn bị mắc kẹt chỉ với một chuyển đổi trước khi tuyên chiến?

Xuất hiện bạn đang đi đúng hướng.

+0

Có, đó là số liệu mua/bán. Tôi nói rằng khách hàng sẽ nhập các giá trị theo cách thủ công chỉ để đơn giản hóa mọi thứ. Trong thực tế, anh ta sẽ tải lên một excel được tạo ra tự động bởi một công cụ nội bộ. –

2

Tôi sẽ không đích thân sử dụng các khóa "tự nhiên". Thay vào đó, có một bảng các quốc gia/tiền tệ có-thực thể:

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

sau đó sử dụng các ID cho những người trong crosstab của bạn:

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) 

này cho phép tôi thay đổi tên của đất nước để một biểu tượng , tên đầy đủ, bất cứ điều gì, mà không cần phải thay đổi định nghĩa của bảng crosstab. Tham gia hai bảng khi truy vấn các giá trị chuyển đổi.

Ngoài ra, tôi đã đi với số thập phân (10,4) và tôi khuyên bạn nên tìm kiếm tối đa có thể. Nó không có giá trị đau đầu cập nhật lập trình để hạn chế kích thước và sau đó phát hiện ra rằng bạn đã chọn một kích thước quá nhỏ. Nó không chiếm đủ không gian để làm cho nó đáng giá để đối phó với những lỗi đó. Tương tự cho varchar bạn sử dụng cho tên. Varchars được lưu trữ hiệu quả.

Ngoài ra, không phải là value sẽ luôn là 1.00? (Tức là, không phải lúc nào bạn cũng chuyển đổi từ 1 sang nghịch đảo nào đó trong một đơn vị tiền tệ khác?) Nếu vậy, bạn có thể thả cột value từ bảng.

Cá nhân tôi thích có giá trị ID được tạo trên tất cả các bảng, vì vậy tôi đặt một giá trị trên crosstab, nhưng một số người có thể cho rằng không cần thiết. Tôi thường tìm thấy sau này, khi tôi đã chọn để bỏ nó ra, rằng tôi muốn tôi đã thêm nó.

tôi có thể thấy có bảng khác cho tên của đồng tiền:

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

Tôi đồng ý, tôi cũng không thích các khóa tự nhiên, chỉ là một phiên bản đơn giản. Tôi thực sự quan tâm đến hiệu suất và khả năng mở rộng, tôi sẽ cập nhật bài đăng cố gắng rõ ràng hơn. Ngoài ra, giá trị luôn luôn! = 1 trong khi giá trị nghịch đảo, theo lý thuyết nên là 1/giá trị, có thể khác nhau do tính chất mua/bán. Cuối cùng, cảm ơn cho các tip lại thập phân, nó chắc chắn là một điểm tốt! –

+0

Re: hiệu suất, vv Tôi đã có một crosstab tương tự một lần (số giết chết giữa các đối thủ chơi game) và điều này là chính xác những gì tôi đã đưa ra. Hoạt động tốt. – Marvo

Các vấn đề liên quan