Mysql数据库设计用于货币兑换网站应用程序

时间:2014-01-31 18:53:43

标签: php mysql api database-design

我正在建立一个使用openexchangerates.org API的网站。

API返回一个类似于:

的JSON响应
{
  "timestamp": 1391191261,
  "base": "USD",
  "rates": {
    "AED": 3.67328,
    "AFN": 56.4876,
    "ALL": 103.8916,
    "AMD": 411.612997,
    /* 165 currencies */
    "YER": 215.057,
    "ZAR": 11.14973,
    "ZMK": 5253.075255,
    "ZMW": 5.579003,
    "ZWL": 322.355006
  }
}

现在我正在考虑这个值的正确表数据库结构。它显示甚至几年前的汇率。我可能不会使用它,但只使用一个月范围内的费率。如何处理这种类型的情况,以显示不同日期等的显示治愈率?

表:

curency \ rate    \ date

AED     \ 3.67328 \ 31-01-2014
AFN     \ 56.4876 \ 31-01-2014

\* and so on for this date... then older rates for past dates *\

AED     \ 3.12367 \ 30-01-2014
AFN     \ 55.2345 \ 30-01-2014

这是一个很好的数据库设计吗?我还应该做些什么?

1 个答案:

答案 0 :(得分:1)

你应该使用这样的表:

id | currency | rate | start-date

当您搜索货币时,您只需要查找具有正确日期的条目(最新开始日期,即早于您要搜索的日期)。

选择:SELECT * FROM table WHERE date < searchDate ORDER BY date DESC LIMIT 1;

如果费率发生变化,您只需添加一个新行,并使用当前的SYSDATE。

选择:INSERT INTO table VALUES (id, 'EUR', '1.4', SYSDATE);

是的,我觉得这张桌子很理想。

如果要删除条目,可能会出现问题 - 突然间,没有“USD”的行,而您的数据库忘记了美元。

让我们看一个例子 - 我们知道2种货币,并将其存储在表格中:

id | currency | rate | start-date
---------------------------------
 1    USD        1      1.1.1970
 2    EUR        2      1.1.1970
 3    EUR        3      5.1.1970

如果我们要删除第一个条目(USD),我们可以这样做。出现的问题是,我们不再有USD的条目了 - 我们的数据库只存储1种货币的汇率。

在这种情况下,您可能希望使用带有外键的2个表。

见这个例子:

表1:

id | currency

表2:

id | fk_currency | rate | start-date

第一个表存储可用的所有货币。第二个表存储了费率。列fk_currency是table1上的外键,包含货币的ID。

如果我们从table2中删除一个比率,我们仍然将该货币存储在另一个表中。数据库没有忘记它。