在RDBMS中存储略有不同类型的记录

时间:2014-10-01 21:52:36

标签: sql database-design relational-database data-modeling

我知道SQL,但我对它并不十分熟悉。我有一个系统,我想在索引数据库中记录用户登录,注销和其他安全相关的事件,以便能够对它进行手动查询,我认为一些基于SQL的RDBMS应该是最适合的工作

但是,我想要存储的记录具有相似但不完全相同的数据。所有记录都会存储时间戳和用户名,但其他数据项会有所不同。例如:

  • 登录事件将存储用户登录的IP地址,以及创建的会话的ID。
  • 注销事件会存储会话ID但不会存储IP地址(因为我在注销时无法访问IP地址)。
  • 电子邮件更改事件将存储用户的新电子邮件地址。

如何在关系数据库中建模这样的东西?我可以想象至少有三种可能性:

  • 为每种数据项使用不同的表
  • 为所有不同的数据项添加列,并将其保留为NULL,以用于不使用它们的记录
  • 使用一个包含公共数据项的中央表,以及存储其余数据的辅助表,链接到中央表中的事件ID
显然,每个人都有自己的优点和缺点。我确实认识到这是一个有点主观的问题,也可能取决于实际的用例,但我想应该有这种事情的标准/最佳实践,我还没有看到。我的任何建议是否合理或标准?还有其他一些我错过的选项吗?

1 个答案:

答案 0 :(得分:1)

您提到的解决方案出现在Martin Fowler的书Patterns of Enterprise Application Architecture中。您可能希望阅读该书以了解他对使用这些模式的看法。

  

为每种数据项使用不同的表

  

为所有不同的数据项添加列,并将它们保留为NULL,以便不使用它们的记录

  

使用一个包含公共数据项的中央表,以及存储其余数据的辅助表,链接到中央表中的事件ID

Fowler还为此问题提供了第四种解决方案: