【问题标题】:Table Design in SQL ServerSQL Server 中的表设计
【发布时间】:2019-03-15 17:17:51
【问题描述】:

我有一个需要表格设计的要求,需要维护为任何应用程序上传的文件。有没有一种简单的方法可以在没有任何触发器/Sproc 的情况下实现这一目标?

ID        AppName FileName    fileorder 
1          abc    file1        1
2          abc    file2        2
3          abc    file1        3
4          xyz    test1        1    - start a fresh 
5          xyz    test2        2
6          abc    file3        4    - resume from previous value of 'abc' 
7          xyz    test3        3    - resume from previous value of 'xyz'
8          grt    file1        1    - start a fresh

【问题讨论】:

    标签: sql-server database-design


    【解决方案1】:

    不,您可以在 CREATE TABLE 中写入任何内容,以这种方式自动填充 fileorder 列。您可以做到这一点的唯一方法是使用一些自定义编码。

    我不知道您想在表中创建这样的列的原因,但出于我能想到的大多数原因,您最好不要将此值存储在表中,而是计算它在查询时,或制作一个包含该列计算的 VIEW。

    【讨论】:

    • 感谢您的回复。这个要求的主要原因是,当我们将文件上传到 SFTP 时,我们不希望重复文件在那里,因为它会替换。我知道我们可以在他们上传时附加时间戳,但我们正在尝试他们上传的订单号。我们最初考虑在 java 层本身做,但是我们有两个并行路径来生成相同的文件名,因此考虑在数据库中维护以保持一致性。视图抽象可能对我们有用。将对此进行测试。再次感谢
    • 是的,如果是创建文件,那么最好将此列添加到 VIEW 中,而不是尝试将其保留在表中。
    【解决方案2】:

    与其将 fileorder 的值写入表,不如编写一个查询来读取如下所示的表:

    SELECT ID, AppName, FileName, ROW_NUMBER() OVER(PARTITION BY AppName ORDER BY ID) AS fileorder
    FROM YOUR_TABLE                      -- Whatever your table name is
    WHERE AppName in ('abc','xyz','grt') -- Any relevant WHERE clause
    ORDER BY ID;
    

    不幸的是,您不能在计算列中使用窗口函数,这将是存储过程或触发器之外的唯一方法。

    【讨论】:

    • 正如 Tab Alleman 所暗示的,您可以使用上面的此查询来填充视图的定义,从而为您提供所需的结果。
    • 感谢乍得的快速回复。我在考虑 Computed Column ,但它又不会像你建议的那样有多大帮助。可能我会选择 View
    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 2012-04-09
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多