【发布时间】:2018-04-19 21:38:20
【问题描述】:
我有一个带有 Access 前端的 SQL Server 数据库,我需要用户能够一次将资源分配给多个项目。例如,我们有一个特定零件的库存,该零件用于许多机械组件,我们需要将这些零件分配给特定的组件进行生产。
人们通常如何表示具有这些要求的数据?
目前我的数据存储如下:
Resource | A | B | C (etc.)
---------+-------+-------+------
a | 10 | 20 | NULL
b | 11 | NULL | 31
c | 12 | NULL | NULL
d | NULL | 40 | NULL
其中 A、B、C 是不同的项目。
优势:
- 轻松可视化和更新所有项目中的资源
缺点:
- 每次添加或完成项目时,数据库结构都会发生变化..
- .. 因此许多查询需要重写/动态
- 很难获得汇总的资源分配摘要
- 如果保留旧项目,表格很容易超过列数限制
替代品
在我看来,更“标准”的表示形式应该是如下表。但是,我发现以一种允许在多个项目中轻松进行可视化和资源分配的方式向用户展示它或多或少是不可能的。
ID | Project | Resource | Quantity
-----+---------+----------+----------
1 | A | a | 10
2 | A | b | 11
3 | A | c | 12
4 | B | a | 20
5 | B | d | 40
6 | C | b | 31
优势:
- 添加/删除项目时没有结构变化
- 简单的资源摘要
- 轻松归档旧项目
缺点:
- 使用 JOIN 重新创建顶部示例界面的视图一次只允许编辑一列,并且不允许通过从/到 NULL 进行更新来插入或删除:
例如
-- 'Resources' table has resource ID as primary key (& other info about resource),
-- 'ProjectResources' is the 'standard' table above
SELECT ResourceTable.ID, ProjA.Quantity AS A, ProjB.Quantity AS B, ProjC.Quantity AS C
FROM Resources
LEFT JOIN (SELECT ProjectResources.Quantity, ProjectResources.Resource
FROM ProjectResources
WHERE ProjectResources.Project = 'A') AS ProjA
ON Resources.ID = ProjA.Resource
LEFT JOIN (SELECT ProjectResources.Quantity, ProjectResources.Resource
FROM ProjectResources
WHERE ProjectResources.Project = 'B') AS ProjB
ON Resources.ID = ProjB.Resource
LEFT JOIN (SELECT ProjectResources.Quantity, ProjectResources.Resource
FROM ProjectResources
WHERE ProjectResources.Project = 'C') AS ProjC
ON Resources.ID = ProjC.Resource
- 在上述视图上使用 INSTEAD OF UPDATE 触发器可以使其完全可编辑,但在任何进一步的查询中使用此视图来添加信息(例如,我们正在分配的资源的“库存”)会使这些字段只读(错误“字段无法更新,因为它参与了 JOIN 并具有 INSTEAD OF UPDATE 触发器”)
上述两个选项都要求前端可以处理不同数量的表列,这有点尴尬,但在第二种情况下,这个要求只能限于特定情况。
关于如何表示这些数据并允许我错过的轻松编辑还有其他选项吗?
【问题讨论】:
-
以目前的形式,这个问题不适合 Stack Overflow(我认为它太宽泛了),但可能更适合 dba.stackexchange.com。
标签: sql sql-server ms-access database-design