Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 一个表用于所有文件,还是多个表具有文件列?_Sql Server - Fatal编程技术网

Sql server 一个表用于所有文件,还是多个表具有文件列?

Sql server 一个表用于所有文件,还是多个表具有文件列?,sql-server,Sql Server,解决方案一是大约有20个表可以在一个单独的列中保存文件,而解决方案二是选择有20个表和一个额外的表来包含所有文件,并且在文件表和其他20个表之间有链接/关系。这些文件是大约0.5MB的小型PDF文件。使用列似乎更安全,因此没有客户端可以错误地看到其他客户端数据。列将是varbinary MAX将它们全部放在一个表中,带有(例如,文件表,文件ID为PK)。其他表将其称为文件ID 为什么? 从其中一个表中选择* 你只知道有人会在你的桌子上做。如果它包含在每个表中,所有这些PDF都将被返回,即使它们没

解决方案一是大约有20个表可以在一个单独的列中保存文件,而解决方案二是选择有20个表和一个额外的表来包含所有文件,并且在文件表和其他20个表之间有链接/关系。这些文件是大约0.5MB的小型PDF文件。使用列似乎更安全,因此没有客户端可以错误地看到其他客户端数据。列将是varbinary MAX

将它们全部放在一个表中,带有(例如,文件表,文件ID为PK)。其他表将其称为文件ID

为什么?

从其中一个表中选择*

你只知道有人会在你的桌子上做。如果它包含在每个表中,所有这些PDF都将被返回,即使它们没有被使用

在您的开发/测试服务器上(没有太多数据,也没有人竞争资源),这不是一个大问题,但可能会真正影响生产性能。如果只是记录为外键(例如,to File.File_ID),那也没什么大不了的:这仍然不好(他们应该只获取他们想要的字段),但比每行多返回半MB要好

可升级的文件管理

在将来的某个时候,您可能希望将文件存储在其他位置(例如,本地文件存储、Dropbox、云中)。无论您选择哪个选项,都需要编写代码来处理可能位于不同位置的文件(实际上,您甚至可能希望将它们从一个位置移动到另一个位置)

如果它都在一个表(文件表)中,那么在表中添加一列来说明它的存储位置就容易多了。其他表中的文件ID引用不需要更改

事实上,您可能会决定将PDF文件存储在数据库中,但存储在与主应用程序不同的数据库中。您甚至可能希望将它们保存在一个数据库中,但保存在一个单独的(较小的)服务器上,该服务器只托管这些文件。通过将文件分开,这些都会变得更容易

所以

  • 您的20个表引用了文件表(例如,File_ID)
  • 文件表包含文件的相关详细信息(名称、放在这里的人、文件类型等),并且是指向文件实际存储位置和存储类型的指针
  • 如果需要,可以使用一个表来存储filestreams/etc

更新:但书

Brent Ozar在10年前制作了一段视频,讲述了在制作过程中出现的“无法扩展的十大开发者错误”

在数据库中存储文件就是其中之一。我认为他称SQL Server为“第二昂贵的文件存储场所”(Oracle是最昂贵的)


他最近对该视频的评论(10年后)仍然同意-参见

我的第一个倾向是建议一个包含列
ClientID
FileContent
的表,以及文件属性和主键的附加列。假设所有数据库访问都是通过应用层对多租户数据库进行的,那么每个客户端使用单个表与单独表的风险应该没有任何区别。在internet多租户数据库中搜索其他注意事项。完全不要这样做。将文件重命名为GUID,并将GUID放入数据库中。将文件放在文件系统中,如果您需要快速提供文件,请使用CDN、内容交付网络,这是非常便宜、超级简单的,并且很可能比数据库使用文件更快地向客户端交付数据。这是一个很好的响应,是一个重要的讨论元素(对于SQL Server)是如何将文件表分配给独立数据文件和下一个progression FileStream访问: