Database design 在单独的模型或一个事件模型中跟踪事件更好吗?

Database design 在单独的模型或一个事件模型中跟踪事件更好吗?,database-design,architecture,Database Design,Architecture,我意识到这个问题是一般性的,但我认为在事件跟踪方面有丰富经验的人会有很好的洞察力 我有一个网站,我想跟踪文件下载的用户。我想到两种方法: 1) 创建一个名为AssetDownload的模型,并用数据填充该模型。 2) 创建一个名为事件或活动的模型,并将其作为跟踪事件的通用模型 我认为有以下优点和缺点: 方法1: 亲-更好的可读性,因为 模型精确地表示事件 Pro-将不需要重构 如果事件成为 太不一样了 Pro-不需要搜索事件 表中的一个额外参数 时间(“事件类型”) Con-可能有很多表 Co

我意识到这个问题是一般性的,但我认为在事件跟踪方面有丰富经验的人会有很好的洞察力

我有一个网站,我想跟踪文件下载的用户。我想到两种方法:

1) 创建一个名为AssetDownload的模型,并用数据填充该模型。
2) 创建一个名为事件或活动的模型,并将其作为跟踪事件的通用模型

我认为有以下优点和缺点:

方法1:

  • 亲-更好的可读性,因为 模型精确地表示事件
  • Pro-将不需要重构 如果事件成为 太不一样了
  • Pro-不需要搜索事件 表中的一个额外参数 时间(“事件类型”)
  • Con-可能有很多表
  • Con-可能不是很干,但是 他们可以继承将军的遗产 未关联的事件模型 用一个表,或者我可以实现一个 “充当可追踪的”宝石
方法2:

  • Pro-所有东西只有一张桌子
  • 默认情况下为Pro-DRY
  • Con-Table将有可能成为 非常宽,列仅为 对于事件的一小部分非常有用
  • Con-可能需要重构 未来的具体事件
我倾向于使用方法1,因为它是一种最低可行的产品思考过程。只要做我需要的,我最终会添加5个模型,每个事件类型1个。如果我添加20个模型,那么我可以使用一个表继承方案进行重构。但至少在这一点上,我会知道我在重构什么,而为未来设计现在需要一些猜测

然而,我现在正在另一个网站上成功地使用方法2。只是想看看别人在干什么

更新

我想提到的是,我正在记录的事件需要经常访问。我将提供一个仪表板,用户可以查看文件下载的用户和日期。如果您的答案涉及使用审计日志模型

< P>方法2,那么请考虑这一点。我一直都是这样做的,除了我把它叫做审计日志,使它非常通用,并用于很多事情

如果需要创建多种类型的条目,请不要将表设置为全表,而是使用多个条目

伪DDL-类型可能会有所不同

CREATE TABLE Audit
   Type           # FK identifying the entry type
   DateTime       # entry time
   RequesterID    # FK identifying the user/process initiating the request
   Object         # Filename etc.
   ObjectClass    # FK defining type of the object 
   AccessType     # FK defining the type of access (download etc.)
   AccessOverride # FK set if accessed via impersonation
   Status         # FK result of operation - success / fail
 ;

注意:最初这是松散地基于VMS审计日志模型。

多年来,我在设计中通常使用方法2。表的宽度从来没有成为一个问题,因为对于事件描述来说,它通常是非常繁重的字符串。我想这意味着任何审计审查都会涉及到审计员的大量手动解析,但是当您处于审计点时,通常会在任何设计中发现这种检测工作


对我来说,最近解决表宽度问题的一种方法是将事件的许多细节存储在一个XML blob中。现在MSSQL对它的支持已经足够好了,我可以构建任何简单的报告工具来使用它。在重新分解特定事件等方面。。。这通常归结为报告工具。我当然不是数据模型专家,也不能就非常大规模的表向您提供建议,但在过去与数据库人员合作时,他们也总是喜欢方法2,并有构建视图/报告等。有第三种选择:

event_header: 
  id
  date
  time
  type
  code
  ... 

event_type_data: 
  PK(id)
  FK(event_id)
  special_field1
  special_field2 
下载查询知道事件类型是4,所以在event_数据表上进行连接

select ev.*, evd.* from event_header ev, event_type_data evd where evd.event_id = ev.id and ev.type = 4 
过度复制?也许。更慢的?可能让未来的开发者感到困惑?对可行的当然可以


在我看来,我可能会使用方法2,为JSON或XML格式的特殊数据提供一个文本字段,或者简单地说是“key:value,key:value”

Richard——我理解审计日志的方式是,它们很适合记录将来要运行大型报告的内容。例如,每次创建、更新用户时,我都可以进行日志记录。我没有明确说明这一点,但我说的是记录需要随时“报告”的内容。例如,对于文件下载,我的用户将有一个仪表板来查看文件的下载次数,并能够按日期和下载程序过滤图表。你仍然相信审计日志模型是正确的选择吗?我仍然认为这是正确的方法。不管它被称为审计还是活动,重要的是结构。有了一套像样的索引,您会发现提取摘要既简单又合理快速。如果可以将对象设置为FK引用,则效果会更好。类型、ObjectClass和AccessType字段用于更好地提取较小的结果集(使用索引)。当我将它用于类似于您所需的报告时,它对我来说效果很好。使用>50k的审计性能是可以接受的。不知道是不是只有我不喜欢存储XML blob-这感觉像是数据建模的缺陷,因为我不能对blob中的数据做任何事情(搜索、排序、索引等)。我以前曾受到过批评,这肯定不是一个好主意。有时候,在需要的时候,这只是一个有用的选择。