如何设计一个表来保存以下数据:
name
age
last_30_measurements
timestamp, value
timestamp, value
timestamp, value
timestamp, value
..
如您所见,last_30_measurements
可以是它自己的表,其中包含一对时间戳,值对。
执行此操作的正确方法是什么?
答案 0 :(得分:4)
我会为此目的使用另一个表,并使用外键链接两者。
例如:
模式(MySQL v5.7)
CREATE TABLE mesurer_dude
(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL
);
CREATE TABLE mesurements
(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
mesure_date DATETIME NOT NULL,
mesure_value INT NOT NULL,
mesurer_dude_id INT NOT NULL,
CONSTRAINT FOREIGN KEY (mesurer_dude_id) REFERENCES mesurer_dude(id)
);
INSERT INTO mesurer_dude VALUES (default, "John", 42), (default, "Jane", 69);
INSERT INTO mesurements VALUES (default, NOW(), 10, 1), (default, DATE_ADD(NOW(), INTERVAL 1 DAY), 20, 1), (default, DATE_ADD(NOW(), INTERVAL 2 DAY), 25, 1), (default, DATE_ADD(NOW(), INTERVAL 3 DAY), 15, 1), (default, DATE_ADD(NOW(), INTERVAL 4 DAY), 12, 2);
查询#1
-- get the last 30 mesurements of john
SELECT *
FROM mesurer_dude d
INNER JOIN mesurements m
ON d.id=m.mesurer_dude_id
WHERE d.name = 'John'
ORDER BY m.mesure_date DESC
LIMIT 30;
结果:
| id | name | age | id | mesure_date | mesure_value | mesurer_dude_id |
| --- | ---- | --- | --- | ------------------- | ------------ | --------------- |
| 1 | John | 42 | 4 | 2018-11-25 14:37:33 | 15 | 1 |
| 1 | John | 42 | 3 | 2018-11-24 14:37:33 | 25 | 1 |
| 1 | John | 42 | 2 | 2018-11-23 14:37:33 | 20 | 1 |
| 1 | John | 42 | 1 | 2018-11-22 14:37:33 | 10 | 1 |