我正在建立一个使用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
这是一个很好的数据库设计吗?我还应该做些什么?
答案 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中删除一个比率,我们仍然将该货币存储在另一个表中。数据库没有忘记它。