存储记录元数据的最佳实践

Tid*_*ddo 13 postgresql database-design metadata

在数据库中存储单个记录的元数据的最佳实践是什么?

我需要在我的数据库中存储许多表的常见元数据,例如创建时间和上次更新时间。我找到了几种不同的解决方案:

  1. 将元数据直接存储在表中。

    优点:

    • 元数据直接链接到记录
    • 无需连接即可检索元数据

    缺点:

    • 需要大量重复列(除非使用继承)
    • 元数据和业务数据不分离
  2. 创建一个通用元数据表,并使用软外键将数据链接到正确的表和记录。

    优点:

    • 没有重复的列
    • 元数据与业务数据分离

    缺点:

    • 元数据和数据之间没有直接链接(不能使用 FK)
    • 联接需要附加条件
  3. 为每个需要元数据的表创建单独的元数据表。

    优点:

    • 元数据直接链接到记录
    • 元数据与业务数据分离

    缺点:

    • 需要很多额外的表
    • 需要大量重复列(除非使用继承)

是否有比我在这里提到的更多的选择、优点或缺点?存储这些元数据的最佳实践是什么?

Erw*_*ter 9

您正在谈论的列占用20 个字节(如果没有填充对齐):

创建时间、更新时间和创建源

时间戳 .. 8 字节
时间戳 .. 8 字节
整数 .. 4 字节

单独表中单独行的元组标题和项目标识符将占用 23 + 1 + 4 = 28 个字节加上实际数据的 20 个字节,加上末尾的 4 个填充字节。使得每行52个字节。看:

关于存储,您没有任何好处。关于性能,每行仅增加 16 - 24 个字节,您几乎不会丢失任何东西。

列也直接属于行,因此将它们放在一起是有意义的。我习惯于将这些列(加上上次更新的单独源)添加到所有相关表中。

编写一个TRIGGER ON INSERT OR UPDATE使它们保持最新状态也更容易。

长话短说:强烈投票支持您的选项 1

我会选择选项 3 的地方
如果元数据经常更新,而核心行不是。然后可能需要保留一个单独的 1:1 表以降低更新成本并减少主表的膨胀 - 甚至选择选项 2。

我会选择选项 2 的地方
如果元数据列集高度重复。您可以在主表中的元数据集上有一个 FK 列。不会像您的示例中那样为三个小列节省太多。