Sql server 一个表用于所有文件,还是多个表具有文件列?
解决方案一是大约有20个表可以在一个单独的列中保存文件,而解决方案二是选择有20个表和一个额外的表来包含所有文件,并且在文件表和其他20个表之间有链接/关系。这些文件是大约0.5MB的小型PDF文件。使用列似乎更安全,因此没有客户端可以错误地看到其他客户端数据。列将是varbinary MAX将它们全部放在一个表中,带有(例如,文件表,文件ID为PK)。其他表将其称为文件ID 为什么? 从其中一个表中选择* 你只知道有人会在你的桌子上做。如果它包含在每个表中,所有这些PDF都将被返回,即使它们没有被使用 在您的开发/测试服务器上(没有太多数据,也没有人竞争资源),这不是一个大问题,但可能会真正影响生产性能。如果只是记录为外键(例如,to File.File_ID),那也没什么大不了的:这仍然不好(他们应该只获取他们想要的字段),但比每行多返回半MB要好 可升级的文件管理 在将来的某个时候,您可能希望将文件存储在其他位置(例如,本地文件存储、Dropbox、云中)。无论您选择哪个选项,都需要编写代码来处理可能位于不同位置的文件(实际上,您甚至可能希望将它们从一个位置移动到另一个位置) 如果它都在一个表(文件表)中,那么在表中添加一列来说明它的存储位置就容易多了。其他表中的文件ID引用不需要更改 事实上,您可能会决定将PDF文件存储在数据库中,但存储在与主应用程序不同的数据库中。您甚至可能希望将它们保存在一个数据库中,但保存在一个单独的(较小的)服务器上,该服务器只托管这些文件。通过将文件分开,这些都会变得更容易 所以Sql server 一个表用于所有文件,还是多个表具有文件列?,sql-server,Sql Server,解决方案一是大约有20个表可以在一个单独的列中保存文件,而解决方案二是选择有20个表和一个额外的表来包含所有文件,并且在文件表和其他20个表之间有链接/关系。这些文件是大约0.5MB的小型PDF文件。使用列似乎更安全,因此没有客户端可以错误地看到其他客户端数据。列将是varbinary MAX将它们全部放在一个表中,带有(例如,文件表,文件ID为PK)。其他表将其称为文件ID 为什么? 从其中一个表中选择* 你只知道有人会在你的桌子上做。如果它包含在每个表中,所有这些PDF都将被返回,即使它们没
- 您的20个表引用了文件表(例如,File_ID)
- 文件表包含文件的相关详细信息(名称、放在这里的人、文件类型等),并且是指向文件实际存储位置和存储类型的指针
- 如果需要,可以使用一个表来存储filestreams/etc
更新:但书 Brent Ozar在10年前制作了一段视频,讲述了在制作过程中出现的“无法扩展的十大开发者错误” 在数据库中存储文件就是其中之一。我认为他称SQL Server为“第二昂贵的文件存储场所”(Oracle是最昂贵的)
他最近对该视频的评论(10年后)仍然同意-参见我的第一个倾向是建议一个包含列
ClientID
和FileContent
的表,以及文件属性和主键的附加列。假设所有数据库访问都是通过应用层对多租户数据库进行的,那么每个客户端使用单个表与单独表的风险应该没有任何区别。在internet多租户数据库中搜索其他注意事项。完全不要这样做。将文件重命名为GUID,并将GUID放入数据库中。将文件放在文件系统中,如果您需要快速提供文件,请使用CDN、内容交付网络,这是非常便宜、超级简单的,并且很可能比数据库使用文件更快地向客户端交付数据。这是一个很好的响应,是一个重要的讨论元素(对于SQL Server)是如何将文件表分配给独立数据文件和下一个progression FileStream访问: