【问题标题】:How to represent allocating resources to multiple projects in SQL如何在 SQL 中表示将资源分配给多个项目
【发布时间】: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


【解决方案1】:

由于您列出的原因,您当前的数据库架构并不理想。您最好使架构合理,然后在 UI 中处理视图,而不是生成适合特定视图的错误架构(如果您也想要其他视图,您将回到同一个桶中,但很难-新视图的使用模式)。

虽然可以在 Access 中将视图生成为交叉表查询,但您将无法对其进行编辑(与您在查询中找到的相同;您实际上是在此处手动构建交叉表查询)。

一个潜在的解决方案是在前端生成一个临时表,其中所需的项目作为列(可能是所有项目的子集),用真实表中的资源数据填充它,并将其显示为数据表。它将是可编辑的,您可以将更改写回真实表。它需要编码,但它解决了缺点。

【讨论】:

  • 还要注意同时进行多个编辑时的限制。本质上,最后一个保存的人将覆盖任何其他更改 - 除非您实施某种“正在编辑”标志以防止其他人开始编辑,但这本身就有很多问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多