Sql Server 行大小限制和表设计

2024-02-07

我在 SQL Server 2008 上有这个查询

CREATE TABLE MediaLibrary
(
MediaId bigint NOT NULL IDENTITY (1, 1),
MediaTypeId smallint NOT NULL,
ImageNameByUser nchar(100) NULL,
GeneratedName uniqueidentifier NOT NULL,
UploadedByUserId uniqueidentifier NOT NULL,
UploadedDate date NOT NULL,
ProfilePhoto bit NOT NULL,
PublicPhoto bit NOT NULL,
AppointmentId bigint NULL,
OriginalImage nchar(1000) NULL,
ThumbImage nchar(1000) NULL,
MediumImage nchar(1000) NULL,
LargeImage nchar(1000) NULL,
UrlThumb nchar(1000) NULL,
UrlMedium nchar(1000) NULL,
UrlLarge nchar(1000) NULL,
InactiveReasonId smallint NULL,
InactiveDate datetime NULL
)  ON [PRIMARY]
GO

当我尝试创建表时出现此错误

创建或更改表“MediaLibrary”失败,因为最小行大小为 14273,包括 9 字节的内部开销。这超出了允许的最大表行大小 8060 字节。

我知道我达到了行大小的限制,但这不是一个大表,所以我想知道这是否不是一个好的设计?

当我改变了nchar(1000) to varChar(1000)桌子保存得很好。我担心的是,一旦数据实际保存到表中,我将再次达到行大小限制。


假设您不打算填充所有列,则需要使用 nvarchar(或只是 varchar)而不是 nchar(或 char)。原因是一个nchar(1000)需要保留2000字节,无论你是否要使用它。对于 varchar/nvarchar 来说,情况并非如此。

现在,如果每列中可能有 1000 个字符,那么无论您使用什么数据类型,它都不起作用。原因是SQL Server中的基本存储元素是8K页。因此,不可能存储超过 8K 的行(存在一些页头开销以及根据列中的数据类型可能使用的其他位)。解决方法通常是:

  • varchar(max) - 可以将不适合行外的数据存储为 blob,但这样做会带来性能开销,并且可能会引入一些限制,例如执行在线重建的能力
  • 更改表结构,以便将这些 URL 作为单独的行存储在单独的表中。例子:

    CREATE TABLE dbo.Media
    (
      MediaID BIGINT IDENTITY(1,1) PRIMARY KEY,
      MediaTypeID SMALLINT NOT NULL,
      ImageNameByUser NVARCHAR(100) NULL, -- should also not be nchar
      GeneratedName UNIQUEIDENTIFIER NOT NULL,
      UploadedByUserId UNIQUEIDENTIFIER NOT NULL,
      UploadedDate date NOT NULL,
      ProfilePhoto bit NOT NULL,
      PublicPhoto bit NOT NULL,
      AppointmentId bigint NULL,
      InactiveReasonId smallint NULL,
      InactiveDate datetime NULL
    );
    
    CREATE TABLE dbo.URLTypes
    (
      URLTypeID TINYINT NOT NULL PRIMARY KEY,
      Description NVARCHAR(32) NOT NULL UNIQUE
    );
    
    INSERT dbo.URLTypes VALUES(1,'OriginalImage'),(2,'ThumbImage'),...;
    
    CREATE TABLE dbo.MediaURLs
    (
      MediaID BIGINT NOT NULL FOREIGN KEY REFERENCES dbo.Media(MediaID),
      URLTypeID TINYINT NOT NULL FOREIGN KEY REFERENCES dbo.URLTypes(URLTypeID),
      URL VARCHAR(2048) NOT NULL
    );
    

顺便说一句,您真的需要支持 URL 的 Unicode 吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sql Server 行大小限制和表设计 的相关文章

随机推荐

  • 使用输入 fn 在 Tensorflow 估计器中进行预测

    我使用来自的教程代码https github com tensorflow tensorflow blob r1 3 tensorflow examples learn wide n deep tutorial py https githu
  • XML - 将属性反序列化为 Xml 子树

    当我反序列化 xml 字符串时 我需要在名为prop2 My XML
  • R 中的字符串操作:删除多个位置的特定模式,而不删除模式实例之间的文本

    在 R 中 我尝试编写适用于字符串模式的任何改编的代码 字符串的一个例子是 string lt y 1 a b c d 2 e 1 f g 我只想删除包含 模式的部分 例如 b c 和 1 f 并留下 y 1 a d 2 e g 请注意 字
  • 在匹配元素处划分列表的 Pythonic 且有效的方法是什么?

    这非常类似于Python 根据条件拆分列表 https stackoverflow com questions 949098 python split a list based on a condition并且https nedbatche
  • 为 NSTableView 中的行着色

    我想要做的是当单击 I 按钮时设置 NSTableView 中所选行的背景颜色 我见过人们使用过的其他案例tableView willDisplayCell forTableColumn row and setBackgroundColor
  • Elasticsearch - 维护文档历史记录

    我是 Elasticsearch 的新手 有一个非常基本的问题要问 我计划使用 Elasticsearch 作为文档存储 并且在存储文档时 我的要求之一是维护历史数据 因此 我可以成功地将文档发布到 Elasticsearch 但是当我发布
  • Perl 中哈希数组树的路径列表

    我有一系列路径 C A C B C D AB 我希望将它们放在哈希数组树中 这样我就可以在 TT2 模板中遍历它们 我的意思是这样的 dirs name gt C subs gt name gt A subs gt name gt B su
  • 在 Android Studio 中使用 NDK、Gradle 和 CMake 链接外部库

    经过一段时间的间隔后 我又回到了 Android 开发 我的旧的基于 ANT 的构建链似乎不再与最新的 SDK 一起运行 这是一个单独的问题 所以我尝试以新的方式做事 这是基于gradle 和 CMake 我的项目需要许多预构建的静态和动态
  • 使用自定义文件格式创建 TensorFlow 数据集

    我正在尝试创建一个 tf data Dataset 其中文件名映射到深度图像 我的图像保存为原始二进制文件 每个文件 320 240 4 字节 图像为 320x240 像素 用 4 个字节表示一个像素 我无法弄清楚如何创建一个解析函数 该函
  • 更改 MariaDB 中的列名称

    我在这个数据库中有此列 其中包含空格键 我想更改它 ALTER TABLE CHANGE COLUMN Anzahl Personen AnzahlPersonen int 11 在命令行中使用此行后 输出如下 ERROR 1064 420
  • 使用敏感设置信息部署到 Heroku

    我使用 GitHub 来存储代码 使用 Heroku 作为 Rails 应用程序的部署平台 我不想在 Git 下保存敏感数据 此类数据包括数据库文件设置 database yml 和一些具有秘密 API 密钥的其他文件 当我部署到herok
  • 从命令行查找并替换 unix

    我有一个多行文本文件 其中每行都有格式 Game 29832 我想将字符 1 附加到每行的每个数字 每行都不同 有谁知道如何从命令行执行此操作 Thanks sed i e s Game 0 9 1 file i用于就地编辑 并且 表示与模
  • 在 NodeJS 中对 SAML2 请求进行数字签名

    我想要对以下 SAML 请求进行数字签名
  • 在服务器套接字java中从客户端获取数据

    我正在创建一个执行以下任务的服务器应用程序 接受客户端的连接 将每个客户端连接处理到单独的线程 接收来自客户端的数据 发送数据给客户端 我能够连接客户端 但无法从客户端接收数据 仅当该客户端断开连接时 数据才在我的控制台中可见 Code p
  • 自动终止 mysql 睡眠进程的 Shell 脚本

    我们如何杀死 mysql 睡眠进程 例如 Id User Host db Command Time State Info
  • php echo 和 return 在 jQuery ajax 调用方面的区别[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在使 jQuery Ajax 调用
  • 如何验证日期不是 .net c# 中的未来日期

    只是徘徊 我如何验证该日期不是 net c 中的未来日期 Example 我已在那里应用了验证以进行所需的字段验证 但不知何故 我不知道如何应用验证来检查开始日期 以确保它不是未来日期 日期不大于当前日期 tr td align right
  • 如何使用 QFileDialog 选项并检索 saveFileName?

    我正在尝试使用 QFileDialog 提示用户提供文件名和保存文本文件的位置 我尝试了 QtGui QFileDialog getSaveFileName 但我对使用某些选项感兴趣 例如设置默认后缀 以及启用保存文件对话框的详细信息视图
  • 在 Node.js 中处理循环内的查询

    在下面的代码中 由于异步行为 val 变量值不断变化并生成意外的输出 即在第一个循环的连接查询完成之前 var 变量根据第二个循环并生成错误的输出 处理循环中查询的最佳方法是什么避免由异步性质引起的特性 var output for var
  • Sql Server 行大小限制和表设计

    我在 SQL Server 2008 上有这个查询 CREATE TABLE MediaLibrary MediaId bigint NOT NULL IDENTITY 1 1 MediaTypeId smallint NOT NULL I