Database design 在单独的模型或一个事件模型中跟踪事件更好吗?
我意识到这个问题是一般性的,但我认为在事件跟踪方面有丰富经验的人会有很好的洞察力 我有一个网站,我想跟踪文件下载的用户。我想到两种方法: 1) 创建一个名为AssetDownload的模型,并用数据填充该模型。Database design 在单独的模型或一个事件模型中跟踪事件更好吗?,database-design,architecture,Database Design,Architecture,我意识到这个问题是一般性的,但我认为在事件跟踪方面有丰富经验的人会有很好的洞察力 我有一个网站,我想跟踪文件下载的用户。我想到两种方法: 1) 创建一个名为AssetDownload的模型,并用数据填充该模型。 2) 创建一个名为事件或活动的模型,并将其作为跟踪事件的通用模型 我认为有以下优点和缺点: 方法1: 亲-更好的可读性,因为 模型精确地表示事件 Pro-将不需要重构 如果事件成为 太不一样了 Pro-不需要搜索事件 表中的一个额外参数 时间(“事件类型”) Con-可能有很多表 Co
2) 创建一个名为事件或活动的模型,并将其作为跟踪事件的通用模型 我认为有以下优点和缺点: 方法1:
- 亲-更好的可读性,因为 模型精确地表示事件
- Pro-将不需要重构 如果事件成为 太不一样了
- Pro-不需要搜索事件 表中的一个额外参数 时间(“事件类型”)
- Con-可能有很多表
- Con-可能不是很干,但是 他们可以继承将军的遗产 未关联的事件模型 用一个表,或者我可以实现一个 “充当可追踪的”宝石
- Pro-所有东西只有一张桌子
- 默认情况下为Pro-DRY
- Con-Table将有可能成为 非常宽,列仅为 对于事件的一小部分非常有用
- Con-可能需要重构 未来的具体事件
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中的数据做任何事情(搜索、排序、索引等)。我以前曾受到过批评,这肯定不是一个好主意。有时候,在需要的时候,这只是一个有用的选择。