【发布时间】:2009-11-20 17:51:32
【问题描述】:
我正在使用 SQL 服务器表来保存带有 URL 的相关信息。所以有一个 Column 作为“URL”,它的类型是 VARCHAR 。在应用程序中,我们必须使用此 URL 作为查询信息的唯一键(我们使用类似 SELECT * FROM Table WHERE URL = "www.google.com\ig")
使用 URL 作为唯一键有什么缺点或已知缺点吗?
【问题讨论】:
标签: sql-server database
我正在使用 SQL 服务器表来保存带有 URL 的相关信息。所以有一个 Column 作为“URL”,它的类型是 VARCHAR 。在应用程序中,我们必须使用此 URL 作为查询信息的唯一键(我们使用类似 SELECT * FROM Table WHERE URL = "www.google.com\ig")
使用 URL 作为唯一键有什么缺点或已知缺点吗?
【问题讨论】:
标签: sql-server database
通常最好使用数值而不是字符串作为表键。在此处查看有关此主题的讨论:Database Primary Key C# mapping - String or int。
至于使用 URL,只要您有一些基本规则来避免插入相同(等效)的 URL 两次,它就不会给您带来任何问题。也就是说,数据库会将 "www.google.com" 和 "http://www.google.com" 解释为不同的字符串,所以你应该有一个规则,比如“URLs will never have协议标识符”或“URL 永远不会以斜杠结尾”,或任何对您的设计有意义的内容。
【讨论】:
正如其他人所说 - 我绝对不会使用像 URL 这样的长字符串作为 SQL Server 表上的主键/集群键 - 但当然,您应该随意对该列设置唯一约束,以确保你没有得到任何重复!
您可以执行 UNIQUE CONSTRAINT 或 UNIQUE INDEX - 最终结果几乎相同(唯一约束也将在幕后使用索引)。 UNIQUE INDEX 的优点是您可以在单独的表中将其作为外键引用,因此我几乎总是使用这种方法:
CREATE UNIQUE NONCLUSTERED INDEX UIX_YourTable_URL ON dbo.YourTable(urlField)
如果您尝试插入表中已经存在的值,则该插入语句将被拒绝并出现 SQL 错误,并且不会发生任何错误。
【讨论】:
我仍然会在表上创建一个聚集列键,例如一个自动编号,然后在 URL 列上创建一个唯一索引。
但是我不明白为什么一个 URL 不是唯一的并且所有的都应该按原样工作。
【讨论】:
如果需要分页,您可能会受益于数字主键。但是您将来仍然可以添加数字索引器。所以把 URL 做成 PK 是没有障碍的。
【讨论】: