在Sql数据库中导入和存储URL到图像 - 需要建议

时间:2012-05-14 16:23:31

标签: asp.net sql-server image hierarchical-data url-scheme

我正在为一家公司工作,该公司拥有数千个文档,大多数是pdf,存储在其网络服务器上的文件夹中。它们主要是用户手册和技术文档,适用于他们携带的不同品牌的不同产品。他们有一个网页,通过递归迭代显示文件夹中所有文档的链接,然后根据文件路径为每个图像生成一个URL。

管理员担心的是,无论何时有人更改保留图像的服务器上的顶级文件夹的名称,它基本上都会“破坏”代码,因为这些顶级名称在应用程序中是硬编码的。他希望所有的URL都存储在数据库中以缓解这个问题,并且让我基本上复制了SQL数据库中Web服务器上的当前文件夹结构,然后将所有URL都放入该数据库中。根据我所做的研究,在关系数据库中实现类似层次结构并不是一项微不足道的任务,我不是DBA - 我是一名Web开发人员。

所以现在我的问题是如何才能将当前Web服务器上数千个图像的URL到达数据库?我想可能只是创建一个名为“Brands”的简单表,其中包含品牌的根URL,然后是另一个名为“Image links”的表,或者类似的东西,然后编写一个小实用程序来简单地遍历所有图像URL和将它们插入到该表中 - 这听起来像是要走的路吗?

1 个答案:

答案 0 :(得分:0)

在我看来,您可以使用C#或PowerShell编写的简单命令行程序轻松导入所有文件夹和文件名,该程序从根开始并迭代所有文件夹和文件。你可以有这样的表:

CREATE TABLE dbo.Folders
(
  FolderID   INT IDENTITY(1,1) PRIMARY KEY,
  ParentID   INT NULL FOREIGN KEY REFERENCES dbo.Folders(FolderID),
  FolderName NVARCHAR(255) NOT NULL
  -- , ... other columns ...
);

CREATE TABLE dbo.Documents
(
  DocumentID INT IDENTITY(1,1) PRIMARY KEY,
  FolderID   INT NOT NULL FOREIGN KEY REFERENCES dbo.Folders(FolderID),
  DocName    NVARCHAR(255) NOT NULL
  -- , ... other columns ...
);

您可以使用Directory.GetFiles()之类的内容填充表格,这样您就可以遍历文件夹和文件。您还可以编写一个函数来展平路径,这样您就不必在构建路径时遍历整个层次结构 - 但基于上述内容,重命名文件夹并始终生成正确的路径而不更新应该非常简单每个文件(尽管您必须更改文件夹并更新数据库并使其保持同步)。只是一些虚构数据的例子:

INSERT dbo.Folders(ParentID, FolderName) SELECT NULL, 'root';
INSERT dbo.Folders(ParentID, FolderName) SELECT 1, 'sub1';
INSERT dbo.Folders(ParentID, FolderName) SELECT 1, 'sub2';
INSERT dbo.Folders(ParentID, FolderName) SELECT 2, 'subsub1';
INSERT dbo.Folders(ParentID, FolderName) SELECT 4, 'subsubsub1';

INSERT dbo.Documents(FolderID, DocName) SELECT 5, 'foo.pdf';
INSERT dbo.Documents(FolderID, DocName) SELECT 5, 'bar.pdf';

给定DocumentID:

,这是一个可以展平路径的函数
CREATE FUNCTION dbo.ShowFullPath
(
    @FolderID INT,
    @DocName  NVARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @FullPath NVARCHAR(MAX);

    WITH cte AS 
    (
      SELECT FolderID, FolderName, ParentID, rn = 1
        FROM dbo.Folders
        WHERE FolderID = @FolderID
      UNION ALL
      SELECT parent.FolderID, parent.FolderName, parent.ParentID, child.rn + 1
        FROM dbo.Folders AS parent
        INNER JOIN cte AS child
        ON parent.FolderID = child.ParentID
    )
    SELECT @FullPath = STUFF((SELECT '/' + FolderName 
       FROM cte ORDER BY rn DESC 
       FOR XML PATH('')), 1, 1, '')
       + '/' + @DocName
    FROM cte;

    RETURN(@FullPath);
END
GO

因此,当您需要检索给定文档的路径时,您总是可以在运行时调用它(并且您可以更改函数或添加一个取代DocumentID的包装器,并提供FolderID和DocName参数),但它为此只使用计算列可能更有意义(遗憾的是,您将无法保留该列)。

ALTER TABLE dbo.Documents ADD FullPath 
  AS CONVERT(NVARCHAR(MAX), dbo.ShowFullPath(FolderID, DocName));

SELECT DocumentID, FolderID, DocName, FullPath FROM dbo.Documents;

结果:

DocumentID FolderID DocName FullPath
1          5        foo.pdf root/sub1/subsub1/subsubsub1/foo.pdf
2          5        bar.pdf root/sub1/subsub1/subsubsub1/bar.pdf

或者你可以创建一个视图:

CREATE VIEW dbo.vDocuments
AS
  SELECT DocumentID, FolderID, DocName, dbo.ShowFullPath(FolderID, DocName)
  FROM dbo.Documents;