我有一个数据库架构来记录用户在我的网络应用程序中执行的操作:
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(使用前将#替换为@)