3

我正在制作一个 MySQL 数据库,并且相当有信心知道如何对其进行规范化。但是,有一个问题我不知道如何处理。

说我有一张桌子

users
----------
user_id primary key
some_field
some_field2
start_date
user_level

现在, user_level 给出了用户的级别,可以是 1,2,3,4,5 说。但随着时间的推移,用户可能会改变级别。显然,如果他们更改级别,我可以简单地对用户表进行更新。但我想保留用户过去水平的历史记录

出于这个原因,我正在考虑一个名为 user_level_history 的新表

user_level_history
--------------
id autoincrement primary key
user_id
level_start_date

然后修改用户表:

users
----------
user_id primary key
some_field
some_field2
start_date
user_level_history_id

然后为了获取用户的当前级别,我检查了

user_level_history_id = user_level_history.id

为了获取用户的历史记录,我可以从 user_level_history 中选择所有具有 user_id 的行并按时间顺序排列。

这是执行此操作的标准方法吗?我无法想象我是第一个遇到这个问题的人。

还有一点:我想象不到 5000 个用户。拥有更多的用户是否需要不同的解决方案?

提前致谢。

4

2 回答 2

3

我认为可以这样设计:
有一个级别信息表,如 value(1,2,3,4,5) ,描述......有一个包含 user_id、level_id、level_start_date
的 user_level_history 关联表......
有一个从级别表到用户表的外键,角色为 user-active-level

您需要开发一种机制,当用户级别发生变化时,会发生插入历史表。 在此处输入图像描述

于 2013-11-09T05:34:42.127 回答
3

不,你不是第一个。查询时态数据是一种常见的需求,尤其是在数据仓库/数据挖掘中。

关系数据模型没有任何原生的、内置的对存储或查询“时态数据”的支持。

已经做了很多工作;我有一本 CJDate 等人的书。很好地涵盖了这个主题:“时间数据和关系模型”。我还看到了几份白皮书。


存储“历史”的一种典型的、相当简单的方法是拥有一个“当前”表(就像您已经拥有的那样,然后添加一个“历史”表。每当更改(插入、更新、删除)行) “当前”表,您向“历史”表添加一行,以及该行更改的日期。(您可以存储更改前行的副本,或更改后行的副本,或两个都。)

使用这种方法,无需向“当前”表添加任何列。

于 2013-11-09T05:35:40.713 回答