我正在为一家公司工作,该公司拥有数千个文档,大多数是pdf,存储在其网络服务器上的文件夹中。它们主要是用户手册和技术文档,适用于他们携带的不同品牌的不同产品。他们有一个网页,通过递归迭代显示文件夹中所有文档的链接,然后根据文件路径为每个图像生成一个URL。
管理员担心的是,无论何时有人更改保留图像的服务器上的顶级文件夹的名称,它基本上都会“破坏”代码,因为这些顶级名称在应用程序中是硬编码的。他希望所有的URL都存储在数据库中以缓解这个问题,并且让我基本上复制了SQL数据库中Web服务器上的当前文件夹结构,然后将所有URL都放入该数据库中。根据我所做的研究,在关系数据库中实现类似层次结构并不是一项微不足道的任务,我不是DBA - 我是一名Web开发人员。
所以现在我的问题是如何才能将当前Web服务器上数千个图像的URL到达数据库?我想可能只是创建一个名为“Brands”的简单表,其中包含品牌的根URL,然后是另一个名为“Image links”的表,或者类似的东西,然后编写一个小实用程序来简单地遍历所有图像URL和将它们插入到该表中 - 这听起来像是要走的路吗?
答案 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;