我会尽我最大的努力把它写成文字。本质上,我们有一个应用程序可以跟踪用户执行的操作。每个 Action 都有自己的表,因为每个 Action 都有不同的参数需要存储。这使我们能够存储这些额外的属性,并很容易地对多个或单个用户的操作进行分析。除了用户执行这些操作之外,这些操作并没有真正相互关联。
示例:
- ActionTableA ID |用户名 |属性A |属性B
- ActionTableB ID |用户名 |属性C |属性D |属性E
- ActionTableC ID |用户名 |属性F
接下来,我们需要为用户执行的每个操作分配一个值,并保留这些值的运行总和。
例子: 值表: ID |用户名 |值(value) | Action 类型 | ActionId
将值表中的值与实际执行的操作相关联的最佳方式是什么?我们知道操作类型(A、B、C)——但从 SQL 设计的角度来看,我看不到在 ActionsTable 中的操作值与实际操作本身之间建立索引关系的好方法。唯一有意义的是将 ValueTable 修改为以下内容:
值表
编号 |用户名 |值(value) | Action 类型 | ActionAId(FK 可空) | ActionBId(FK 可空) | ActionCId(FK 可空)
但我遇到的问题是 3 个 actionTableId 列中只有一个有值,其余列为 Null。此外,随着操作类型的添加,值表中的列也会添加。最后,为了以编程方式查找数据,我要么 a) 必须检查 ActionType 以获得 Id 的适当列,要么 b) 扫描行并选择非空 actionId。
对于这个特定问题,是否有更好的方法/设计,或者这只是“现状”。
编辑
附件是上述设置的示意图:
对于清晰度问题,我们深表歉意,输入 SQL 问题总是很有挑战性。所以我认为您的评论让我想到了一些事情......我可以有一个 SystemActionId 表,它基本上具有自动生成的值
SystemActions:Id |类型
然后,每个 ActionTable 都会有一个额外的 FK 到 SystemAction 表。最后,在 ValueTable 中 - 也将其关联到 SystemActions 表。这将使我们能够将值(value)观与具体行动联系起来。我需要将操作表加入到系统操作表中
JOIN (((SystemActions.Id = ActionTableA.Id) JOIN (SystemActions.Id = ActionTableB.Id)) JOIN (SystemActions.Id = ActionTableC.Id)
蹩脚的快速 sql 语法
这就是您在下面的回答中暗示的内容吗?可能看起来像的快照:
最佳答案
你的问题有点不清楚,但看起来你应该在每个操作表中都有一个(非规范化的)值列,或者在值表中有一个由每个单独的操作表键入的人工键。
关于sql-server - 将多个子表关联到一个父表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737757/