我正在研究一个项目,但是设计数据库时遇到了问题。 我需要存储一年中每天的价格,但我需要能够更改特定日期的价格。
我是否需要每天创建一个列,在这种方法中我必须在表中创建365列。
您对这个问题有什么更好的解决方案,我们将不胜感激,谢谢。
答案 0 :(得分:5)
您应该创建一个包含6列的表。
CREATE TABLE IF NOT EXISTS priceHistory (
`price` decimal(8,2) NOT NULL,
`date` datetime,
`productId` VARCHAR(50),
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`createdAt` TIMESTAMP DEFAULT NOW(),
`updatedAt` TIMESTAMP
) ENGINE = INNODB;
现在您可以插入每天的日期和价格,自动插入created_at
,updatedAt
和id
列(并updatedAt
自动更新),这样您就可以了不再需要为他们打扰了。
如果您要在每日基础上保存这些价格并稍后访问数据,那么您甚至不需要date
列,只需使用createdAt
,再次自动创建INSERT
SELECT * FROM priceHistory WHERE DATE(`date`) = '2015-02-29';
。
获得数据后,您可以像
一样查询数据productId
您可能还会在DATE函数上找到mysql's documentation。
修改
正如@murenik在他的回答中提到的那样,推荐的方式是建立一个与表格的关系,保存您可能拥有的产品详细信息。为此,请将productId INT PRIMARY KEY REFERENCES products(id),
语句更改为
SELECT ph.*, p.*
FROM products p
INNER JOIN priceHistory ph on p.id = ph.productId
这将链接这些表格,使未来的查询更容易,更有效。
//Expanding
var result = nerdamer('a*(x+y)',null,'expand');
document.getElementById('text').innerHTML = '<p>'+result.text()+'</p>';
//Solving equation
var sol = nerdamer.solveEquations('0=x^2+x+a','x');
document.getElementById('text').innerHTML += '<p>'+sol.toString()+'</p>';
请参阅mysql JOIN。
答案 1 :(得分:1)
经典的解决方案是使用联结表,每个产品的每个日期的价格:
CREATE TABLE product_prices (
product_id INT REFERENCES products(id),
price DECIMAL (5, 2),
date DATE,
PRIMARY KEY (product_id, date)
);
答案 2 :(得分:0)
只需为
制作一张桌子id of the product | date | price
答案 3 :(得分:0)
我们在一个工作地点有一个复杂的费率表,而不是存储每天的费率,我们将费率存储在它改变的第一天。因此,如果Unit1(例如一家汽车旅馆)在1月到4月期间每晚50美元,那么在旅游季节夏天每晚65美元,然后在秋季回到每晚50美元,那么费率表将有3条记录:
Start Date Close Date Unit # Rate
------------ ----------------- ------- -------
January 1, 2015 March 30, 2015 Unit1 $50
April 1, 2015 September 30, 2015 Unit1 $65
October 1, 2015 December 21, 2015 Unit1 $50
然后,您需要做的就是查找所选日期介于开始日期和结束日期之间的费率记录。