我正在创建一个MySQL数据库,并且相当自信我知道如何规范它。但是,有一个问题我不知道如何处理。
说我有一张桌子
users
----------
user_id primary key
some_field
some_field2
start_date
user_level
现在,user_level给出了用户的级别,可以是1,2,3,4,5。但随着时间的推移,用户可能会改变等级。显然,如果他们改变了级别,我可以简单地对users表进行UPDATE。但我想保留用户过去水平的历史记录
出于这个原因,我正在考虑一个名为user_level_history
的新表user_level_history
--------------
id autoincrement primary key
user_id
level_start_date
然后修改users表:
users
----------
user_id primary key
some_field
some_field2
start_date
user_level_history_id
然后,为了获得用户的当前级别,我检查
user_level_history_id = user_level_history.id
要获取用户的历史记录,我可以使用user_id从user_level_history中选择所有行,并按时间顺序排序。
这是执行此操作的标准方法吗?我无法想象我是第一个遇到这个问题的人。
还有一点:我想象的用户不到5000人。拥有更多用户需要不同的解决方案吗?
提前致谢。
答案 0 :(得分:3)
不,你不是第一个。查询时态数据是一种常见的要求,尤其是在数据仓库/数据挖掘中。
关系数据模型没有任何本机,内置支持存储或查询“时态数据”。
已经做了很多工作;我有一本C.J.Date等人的书。正确地涵盖了这个主题:“时间数据和关系模型”。我也遇到过几篇白皮书。
存储“历史”的一种典型的,相当简单的方法是拥有一个“当前”表(就像你已经拥有的那样,然后添加一个“历史”表。每当一行被更改(插入,更新,删除)在“当前”表中,向“历史”表中添加一行,以及行更改的日期。(您可以存储更改前行的副本或更改后的副本行或两者。)
使用这种方法,不需要在“当前”表中添加任何列。
答案 1 :(得分:2)
我认为可以这样设计:
有一个表信息,如值(1,2,3,4,5),描述...
拥有user_level_history 的关联表,其中包含user_id,level_id,level_start_date ...
从级别表到用户表的外键具有角色user-active-level 。
您需要开发一种机制,当用户级别发生变化时,会发生插入历史记录表。