这是我面临的设计问题的简化示例:我有 3 个表:Car
,Ship
和Bicycle
。我需要添加一个“活动日志记录”表来记录用户操作,例如删除和用户评论等。我正在考虑只创建一个表。而不是 3 张桌子。问题在于确保参照完整性。我应该创建 3 个单独的列来链接到这些表吗?是否应该只有一列,我在需要时使用它?在这种情况下,一般建议是什么?还是我应该只创建 3 个单独的表?
这是我面临的设计问题的简化示例:我有 3 个表:Car
,Ship
和Bicycle
。我需要添加一个“活动日志记录”表来记录用户操作,例如删除和用户评论等。我正在考虑只创建一个表。而不是 3 张桌子。问题在于确保参照完整性。我应该创建 3 个单独的列来链接到这些表吗?是否应该只有一列,我在需要时使用它?在这种情况下,一般建议是什么?还是我应该只创建 3 个单独的表?
可以根据您是要使用触发器还是应用程序来处理填充这些表,以任何一种方式进行参数。
我认为这取决于你到底想在这些日志表中存储什么,如果你正在记录任何特定于你的 3 个“数据”表的东西,那么你最好使用 3 个日志表(每个“数据”表 1 个日志表这将更容易使用触发器填充),否则您可以将所有内容存储在 1 个表中(使用 1 个字段来引用每个数据表),这将使报告更容易。
至于参照完整性,如果您实际上是在删除原始数据记录(而不是仅仅将其标记为已删除),那么您的外键将没有任何链接。
这是我去规范化以获得集中报告和应用程序逻辑的这些情况之一(尽管触发器可用于此,具体取决于您存储的内容)。
我使用的数据库具有我在下面概述的解决方案。我不喜欢它,因为基表对每种类型都有一个条目,它最终变成了一个查询速度很慢的巨大表。
--基表
--“汽车”记录表
--另一个子表
获取您要查询的所有船舶日志
这是一个简洁的设计,但是如果每种事物都生成十个或二十个日志条目,那么您不必做太多事情就可以拥有一个包含一百万个条目的 application_logging 的巨大表。用户抱怨查看活动日志很慢。
真正的问题是:
正如@Steb 所说“这一切都取决于”。您的应用程序、您的用户、交易数量……