我有一个用ASP.NET MVC创建的新闻网站。
以下是我的表格:
CREATE TABLE [dbo].[News] (
[NewsID] INT IDENTITY (1, 1) NOT NULL,
[InstitutionID] INT NOT NULL,
[Title] NVARCHAR (450) NOT NULL,
[NewsDate] DATETIME NOT NULL,
[Description] NVARCHAR (MAX) NULL,
[path] NVARCHAR (MAX) NULL,
[PostedBy] NVARCHAR (MAX) NULL,
[ContactPhone] NVARCHAR (MAX) NULL,
[ContactEmail] NVARCHAR (MAX) NULL,
[NewsExpiryDate] DATETIME NOT NULL,
CONSTRAINT [PK_dbo.News] PRIMARY KEY CLUSTERED ([NewsID] ASC),
CONSTRAINT [FK_dbo.News_dbo.state_InstitutionID] FOREIGN KEY ([InstitutionID]) REFERENCES [dbo].[state] ([InstitutionID]) ON DELETE CASCADE );
我注意到我的数据库已增加到8GB,加载页面的速度越来越慢。
我正在考虑将新闻存储在文件中,然后将路径保存在数据库中。
无论如何,我可以转换表示" [描述]"到一个文件,然后将路径存储到我的数据库?
答案 0 :(得分:2)
当然,您可以在本地存储文件,然后在数据库中“链接”它们。但是,如果您的应用程序和数据库不在同一台服务器上,那么这种方法可能是错误的(数据库服务器应针对文件存储进行优化,这就是文件应该去的地方)。首先,如果将Description
字段存储在off-db之外,则会丢失所有查询和索引的可能性。其次,数据库服务器“应该”足够强大,可以完成这项任务。您应该考虑调整数据库引擎和服务器。
让我们假设你已经完成了所有这些。您需要确保您的应用程序(连接到数据库的东西)可以写入和读取这些文件。您可能需要设置一个具有足够空间的顶级目录。您应该注意权限/安全性 - 谁可以读/写这些文件。最后,您需要一个存储文件和创建这些文件的方案。一个典型的方案是将描述转换为散列(md5在这里可以,sha256最好)并使用散列作为文件名。你砍掉文件名,使它包含2或3级目录(大目录通常会使某些系统失速):所以ab2442vc25
变为a/b2/442vc25
。将您的说明存储在那里,并将路径名称存储在Description_path
中。在这些情况下保持Description
为空。
但我怀疑这实际上会有所帮助。
答案 1 :(得分:0)
评论中指出John Saunders,您滥用nvarchar(max)
。
如果Title
可以存储在450个字符中,那么ContactPhone
肯定可以存储在少于20个字符中。PostedBy
和Email
也可以被截断为更合适的大小,我猜测path
最多也不应超过100个字符
另外,如果可能的话,我可能会将PostedBy
,ContactPhone
和ContactEmail
移动到新表(我可能称之为NewsAuthors
)并在新闻表中替换它们通过此表的外键。这有可能为您节省大量存储空间。
至于性能,存储大小通常不是问题,因为评论中提到了NotMe 您可以通过在数据库上使用适当的查询和索引来显着提高性能。
一个好的起点是直接在SSMS上运行最常见的查询并查看执行计划。 SQL Server可能会建议创建索引。如果是的话,创建它们。