优雅的模式来记录用户的操作

2024-04-23

我有一个数据库架构来记录用户在我的网络应用程序中执行的操作:

Log
---
Id
Log_Type_Id
Performed_by_Person_Id
Performed_to_Person_Id
Comment_Id
Story_Id
Photo_Id
etc_Id

Person_Log
----------
Person_Id
Log_Id

这样我就可以通知用户日志中的条目以及到底发生了什么的详细信息。问题是日志表必须包含每种可能的用户操作类型(他们修改故事或评论,创建故事或评论或照片,更新个人资料等)。对于每个条目来说,几乎所有这些字段都必须为空。

理想情况下,我有整体日志引用的单独日志表,可能类似于:

Log
---
Id
Performed_by_Person_Id

Log_Comment
-----------
Id
Log_Id
Comment_Id

Log_Photo
---------
Id
Log_Id
Photo_Id

Person_Log
----------
Person_Id
Log_Id

问题是我没有一种简单的方法来通知用户与他们相关的事情。我很容易获得它们的日志条目,但随后我必须查询每个“子”表以查看具体信息...我可以将子日志表的名称存储在 Log 中,但这看起来很不优雅。是否有更好、更相关的方法来执行此操作,并且也适用于 ORM 系统?


您的案例看起来像是 Gen-Spec 设计模式的一个实例。 Gen-spec 通过超类-子类层次结构为面向对象程序员所熟悉。不幸的是,关系数据库设计的介绍往往会跳过如何为 Gen-Spec 情况设计表。幸运的是,它很好理解。谷歌搜索“关系数据库泛化专业化”将产生几篇关于该主题的文章。或者你可以看看下面的内容之前的讨论 https://stackoverflow.com/questions/5001417/this-should-be-simple-but-how-do-i-design-this.

诀窍在于子类(专用)表的 PK 的分配方式。它不是由某种自动编号功能生成的。相反,它是超类(通用)表中 PK 的副本,因此是对其的 FK 引用。

因此,如果情况是车辆、卡车和轿车,则每辆卡车或轿车都会在车辆表中拥有一个条目,卡车也会在卡车表中拥有一个条目,其 PK 是车辆表中相应 PK 的副本。对于轿车来说也是如此。只需进行连接即可轻松判断车辆是卡车还是轿车,并且您通常希望在此类查询中连接数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优雅的模式来记录用户的操作 的相关文章

随机推荐

  • 比较 dateutil.relativedelta

    我正在尝试在两个相对增量之间进行 gt 比较 if relativedelta current date last activity date gt relativedelta minutes 15 以下是 Eclipse 中调试器窗口的输
  • 更改python文件的第一行

    我只需要读取一个大文件的第一行并更改它 有没有一种技巧可以使用Python仅更改文件的第一行并将其另存为另一个文件 我所有的代码都是用 Python 完成的 这将帮助我保持一致性 这个想法是不必读取然后写入整个文件 shutil copyf
  • 尝试用C语言创建链表

    我正在尝试用 C 语言创建一个链表结构 但我不太确定出了什么问题 我的错误是 linked c 6 2 error unknown type name linkedList linked c In function makeList lin
  • 如何将图像从 React 上传到 ASP.NET Core Web API?

    我在 mt 服务器端有 Web API 控制器 HttpPost CreateImage public void CreateImage FromBody ImageDTO img Image image new Image FileNam
  • Mule 文件入站轮询配置

    我想以特定的时间间隔一次从特定目录轮询 10 个文件 如果该目录中存在 250 个文件 Mule 文件入站应从 250 个文件中取出 10 个文件并处理它们 然后再处理 10 个文件等 我的轮询频率值为 10000 我尝试像这样应用 max
  • 递归获取所有孩子

    我需要递归地从嵌套对象中获取所有子对象 我已经写了一个函数来做到这一点 有点 但我认为它可以改进 我怎样才能让它更短更干净 我已经包含了我用于测试的数据以及我编写的需要改进的函数 let data id 1 child id 2 child
  • 从 GCM 2.0 迁移到 GCM 3.0 InstanceID API

    目前我已经在 Play 商店上发布了我的应用程序 并且在该项目中我正在使用 compile com google android gms play services 7 0 0 Google Play 服务库版本7 0在我的项目中使用 Go
  • 实体框架不创建数据库

    一直在使用 ASP NET MVC 3 项目尝试 Entity Framework 4 1 的 Code First 功能 但是 数据库 SQL Server 2008 R2 不会在应用程序启动时自动创建表映射 关于如何让它这样做有什么想法
  • C 中的动态二维数组分配

    我应该如何在 C 中分配动态数组 目前我有一个我写的函数叫做malloc2D看起来像这样 void malloc2D size t unitSize uint firstCount uint secondCount void pointer
  • 为什么我不能在 Laravel 路径中使用“php artisan”命令(Windows)

    我尝试在 Ubuntu 中学习 Laravel 命令 php artisan 在终端的 laravel 文件夹路径中工作 我刚开始在Win7中这样做 我在cmd exe中输入 cd c wamp www myproject 来更改larav
  • 增加具有重复组的组的行号

    我正在研究 PLSQL Oracle 12 的查询 其中我需要增加每个组的数据集的行号 我的问题与这个问题类似 增加组上的行号 https stackoverflow com questions 11116275 increment row
  • WPF:无法让我控制焦点

    我似乎无法真正控制焦点 XAML
  • 在Playframework2中,如何服务多个资源目录?

    asset目录有两个 一个是 ui dist另一个是 public 我尝试这样写路线 GET assets file controllers Assets at path public file GET ui file controller
  • 如何将自定义标签库与 Thymeleaf 和 Spring Boot 结合使用?

    我用 Spring MVC JSP 和 Tyles 创建了一个自定义标签库 所以我有几个 tagx文件 在新项目中 我决定尝试 Spring Boot 和 Thymeleaf 但我想保留我的自定义库 那么您是否可以使用 thymeleaf
  • mysql复合索引是否会使其他一些索引完全冗余?

    如果我在 a b 上有一个复合索引 我知道仅与 a 相关的查询仍将使用复合索引 但与 b 相关的查询不会 我的问题是 如果我有 a b 索引 是否有任何正当理由在 a 上建立单列索引 我读到的内容对于 a b 索引是否完全替代 a 或者仅仅
  • 将重叠间隔与 lubridate 结合起来

    我希望组合润滑间隔 以便如果它们重叠 则从内部第一个时间中取出最小值 并从内部最后一个时间中取出最大值 并汇总以创建一个跨越整个周期的新间隔 这是一个代表 library lubridate warn conflicts FALSE lib
  • Docker“共享依赖关系”

    在阅读 Docker 的同时 我多次停下来 因为 Docker 容器不仅共享主机内核 而且如果可能的话 它们还共享通用的二进制文件和库 我从中了解到的是 如果我在同一台主机上运行相同的 docker 映像两次 并且该映像使用一些文件 x y
  • 如何生成具有指定增量步骤的列表?

    如何生成具有指定增量步长 例如 2 的向量 例如 我如何生成以下内容 0 2 4 6 8 10 执行中seq 1 10 1 做什么1 10做 您可以更改最后一个参数seq i e by 任意大小的台阶 gt a vector of even
  • R中有“暂停”功能吗? [复制]

    这个问题在这里已经有答案了 我正在编写一个用户定义的函数 其中包含一个 for 循环 并且希望在每次迭代后暂停执行 是否有一些函数可以执行此操作 例如 MATLAB 中的 暂停 是的 您可以使用以下命令暂停执行Sys sleep 因此 等待
  • 优雅的模式来记录用户的操作

    我有一个数据库架构来记录用户在我的网络应用程序中执行的操作 Log Id Log Type Id Performed by Person Id Performed to Person Id Comment Id Story Id Photo