mysql历史表_MySQL历史表设计和查询
TL; DR:这个设计是否正确,我应该如何查询?
我们假设我们有city和地址的历史记录表,其设计如下:
CREATE TABLE city_history (
id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
name VARCHAR(128) NOT NULL,
history_at DATETIME NOT NULL,
obj_id INT UNSIGNED NOT NULL
);
CREATE TABLE address_history (
id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
city_id INT NULL,
building_no VARCHAR(10) NULL,
history_at DATETIME NOT NULL,
obj_id INT UNSIGNED NOT NULLmysql帮助文档
);
原始表⼏乎相同,除了history_id和obj_id(city:id,name; address:id,city_id,building_no )。 city和地址(city_id)之间也存在外键关系。
历史记录表会在原始条⽬(创建,更新,删除)的每次更改时填充,并在给定时间显⽰条⽬的确切状态。
obj_id保存原始对象的id - 没有外键,因为原始条⽬可以删除,历史记录条⽬也不能。 history_at是创建历史记录条⽬的时间。
为每个表单独创建历史记录条⽬ - 更改城市名称会创建city_history条⽬,但不会创建address_history条⽬。
因此,要查看任何T1时间点的城市整个地址的状态(例如打印⽂档),我们会从两个历史记录表中获取给定的最新条⽬obj_id在T1之前创建,对吗?
理论上我们应该能够在任何给定的时间点使⽤city来查看signle 地址的状态。任何⼈都可以帮助我为给定的地址ID和时间创建这样的查询吗?请注意,可能有多个记录具有相同的确切时间戳。
还需要创建⼀个报告,⽤于显⽰给定时间段内给定地址的每个状态变化,其中包含" city_name,building_no,changed_at"等条⽬。是否可以使⽤SQL查询创建?性能在这⾥并不重要,这些报告不会经常产⽣。
在⽤户可以过滤结果的交互式版本中可能需要上述报告,例如按城市名称或建筑物编号。是否仍然可以在SQL中执⾏?
实际上地址表和address_history表中还有4个外键应该在报告中加⼊(街道,等)。查询不会长达⼗页,以提供所有必需的功能吗?
醇>
我试图建⽴⼀些查询,与每组最⼤的玩家⼀起玩,但我不认为我可以随处获得。这个设计对我的⽤例来说真的很好吗(如果是这样,请你提供⼀些问题让我⼀起玩,以便得到我想要的地⽅?)?或者我应该
重新考虑整个设计?
任何帮助表⽰感谢。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论