设计DB表的最佳实践是什么?

时间:2010-07-16 09:57:12

标签: postgresql database-design

我们正在构建我们的数据库设计(使用PostgreSQL)和(几乎)每个表,我有以下列

CREATE_TIMESTAMP TIMESTAMP,
CREATED_BY       VARCHAR(25),
modified_TIMESTAMP TIMESTAMP,
modified_BY       VARCHAR(25),

我也在为一些实体表使用Audit表。截至目前,DB大约有15个表(很快将增长到大约50个)。对于这些表中的大约20%(实体),我们需要将它们(使用触发器)备份到审计表的IDENTICAL副本。 例如:一个家庭有一个或多个“联系人”。联系人有电子邮件,电话等信息PLUS 1“地址”。因此,当一个族被创建或修改或删除时,使用触发器,我将族表的内容复制到其AUDIT表Family_Audit。同样,当对“联系人”表进行更改时,我会将其复制到Contact_Audit表。地址相同。

更改日志表:如果我已经拥有需要“审核”的每个实体表的审核表,那么拥有更改日志表有什么意义?

鉴于此,我想知道使用上述“样板”列是否对我来说仍然有意义。

有任何意见吗?

更重要的是,您(几乎)每个表添加的样板列是什么?为什么?

2 个答案:

答案 0 :(得分:4)

我尽量避免使用“样板列”。

如果需要更改日志,请在日志中创建一个ChangeLog表,其中包含用户名,时间戳,表名和表行ID。

接近“样板”的唯一东西是代理主键(称为ID)。

在大多数情况下,“样板” - 改变历史 - 甚至都不是问题,因为我试图创建保存历史的设计。我尽量将UPDATE的发生率降到最低。

可以使用“当前”记录和所有先前版本的记录轻松保存数据(完整地)。磁盘现在很便宜。用户更新的历史记录似乎更好。撤销用户更改是微不足道的,因为以前的版本都可用。

我不再在“样板列”中看到任何值


  

如果未保存实际内容(在其他列中),如何在日志中存储“表行ID”?

什么? 行的先前值可以保存。这才是重点。您有多种保留历史的方法。

  1. 将历史记录表与以前的值分开。

  2. “旗帜” - 创建一个由两部分组成的键 - 具有“当前”与“历史”设置。

  3. 可能使用“活动开启”和“非活动开启”日期对。

  4. 还有其他技术。阅读有关慢速变化尺寸(SCD)算法的信息。

    这些技术中的每一种都有独特的要求;它们是设计模式,而不是样板。

答案 1 :(得分:0)

在完整审核表的存在下,您确定这些列在逻辑上是多余的。

如果您需要对查询进行简单的,基于索引的访问,则会出现保留其中任何一个的优势,例如:

  • 列出在特定日期范围内创建的记录(尽管这仍然可以很容易地从审计表中回答)。
  • 列出特定人员上次更新的记录(不太容易优化此类查询)。
  • 显示最近更新的100条记录(再次,在审计表上不那么容易优化)。

我会把它们留下来,只有在需要时才将它们重新加入。您可以在此时从审计表中填充现有行的值。