如何表示在SQL

时间:2017-11-07 13:04:29

标签: sql sql-server ms-access database-design

我有一个带有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来插入或删除:

e.g。

-- '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触发器可以使其完全可编辑,但在任何进一步的查询中使用此视图来添加信息(例如我们所提供的资源的“库存”#39;分配)使这些字段只读(错误沿着'字段的行无法更新,因为它参与JOIN并具有INSTEAD OF UPDATE触发器')

上述两个选项都要求前端可以处理不同数量的表列,这有点尴尬,但在第二种情况下,此要求仅限于特定情况。

关于如何表示这些数据并允许我错过的简单编辑还有其他选项吗?

1 个答案:

答案 0 :(得分:0)

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

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

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