我想到的两个选项是在表中添加一个名为 Current 的布尔列;但我敢肯定,由于可以将多个记录设置为当前记录,这会违反某种程度的规范化。
或者有另一个表指定当前记录的 ID,但这似乎也不是一个很好的方法。
有没有更好的方法或约定来实现这种事情?
编辑: 我可能应该说只能有一个当前记录,所以当它被更改时,以前的当前记录需要删除它的“当前”状态。该系统还没有复杂到需要担心并发性或类似问题的程度。这个问题的主要原因是,如果有的话,我想以正确/传统的方式做事。
我相信最好的方法是有一个设置表来保存当前记录的 ID。
我已经看到了几种方法:
布尔值(如果选择的 DBMS 支持)或字符(例如“Y”、“N”)指示列;
一个更通用的“状态”列,包含诸如“ACTIVE”、“HISTORY”、“EXPIRED”等值。
一对时间戳列(例如 START_DT、END_DT),指示特定记录处于活动状态的日期范围。当前记录在未来会有 END_DT 值,比如 '9999-12-31',这使得查询当前记录变得简单:
...where current_date between START_DT and END_DT
一个历史表,所有非当前记录一旦成为非当前记录就会被移动。如果您只对当前记录感兴趣,您将查询当前表,否则您将查询
UNION ALL
同时包含当前表和历史表的视图。在前三种情况下,如果您的应用程序无法做到这一点,您将需要通过某种约束来确保一致性。
您选择哪种方法取决于您的特定案例中当前记录的构成。
假设每个登录都可以有一个“当前记录”,你可能有一个表格,形式如下:
但是,需要维护此表并在之后进行清理。
如果“当前记录”基于客户端应用程序,则可能只是将其保存在内存中并将 current_id(或等效项)传递到您使用的任何查询、过程等。
如果您担心并发性,请使用适当的锁来控制那幅图。
编辑:根据您的更新,因为只有一个“当前记录”,所以我同意具有当前记录 ID 的单行表就足够了。