有没有办法允许unique
最多 3 条记录上的密钥相同?
我有一张带有网址的表格。我不希望我的程序将相同的 url 放在三个以上的记录中。它有三个原因,但太多了。知道我怎么能做到这一点吗?
URL 是否来自规范化的 URL 表,因此该表中只有 UrlID,或者这是 URL 的源表?这里的区别很重要,因为您的意思是,在此表是 URL 的来源的情况下(听起来是这样),您计划在 URL 字段上创建一个 UNIQUE 约束或索引。即使他们确实允许指定每个不同值允许的条目数,但由于索引仅允许最多 900 个字节,因此该计划仍然不起作用。很多 URL 都超出了这个限制,并且考虑到您应该使用NVARCHAR
来存储 URL(因为它们可以包含 Unicode 字符,即使这种情况很少见,因此您还应该启用DATA_COMPRESSION 如果您使用的是企业版和 SQL Server 2008 或更高版本),那么它只有 450 个(一般来说)字符,这更加有限。
您应该创建一个AFTER INSERT, UPDATE
触发器来强制执行此规则。无论 INSERT 或 UPDATE 的来源如何,使用触发器都允许您强制执行此规则,而将此逻辑放入存储过程并不能保证捕获所有插入或更新表的尝试,尤其是即席查询。
在性能方面,根据此表随着时间的推移将有多少行,每次必须进行此检查肯定会减慢速度。您应该找到缩小数据子集范围以加快搜索的方法,这样您就不会阻止所有 INSERT 和 UPDATE 查询。需要考虑的一些事项:
将 URL 规范化到另一个表。URL 最多可以有 2048 个字符(我相信),因此如果您知道通常会有重复,请创建一个单独的 URL 表,该表将具有唯一的 URL,并在该表中放置一个 UrlID。然后您可以轻松地索引 UrlID 外键字段。这种方法将节省大量磁盘空间,使触发器更快,并且实际上对该表的大多数查询(尤其是那些不需要 URL 文本的查询)更快,因为您将在每个数据页上拟合更多行。
如果您需要在此表中保留 URL,请添加 UrlHash VARBINARY 字段并使用HASHBYTES的结果填充该字段。UrlHash 字段也可以被索引,在这种情况下,您可以考虑将 Url 字段作为INCLUDE
列添加到该索引中(它没有 900 字节的限制,但也没有排序并且没有统计信息)。然后您的触发器可以搜索传入值的 HASHBYTES 值,任何匹配的条目都会比较完整的 URL 文本。是的,您需要在哈希值匹配的情况下比较两者,因为不同源字符串之间的哈希值可能会发生冲突。但它会帮助您轻松消除大部分时间应该是不匹配的情况。
这个 UrlHash 字段应该是一个非持久化的计算列(并且索引如上所述)。这将确保哈希值始终与源字符串同步。“non”-Persisted 的原因PERSISTED
是该值不需要存在于索引中,而该值仅用于索引,因此没有理由占用额外的空间。如果有兴趣,请参阅计算列索引的 MSDN 文档以获取更多详细信息。
归档时间: |
|
查看次数: |
130 次 |
最近记录: |