我在表格中维护了一个全球网站存储库。
website:
id, name, url
1 google http://www.google.com/
2 CNN http://www.cnn.com/
3 SO http://www.stackoverflow.com/
我维护一个参考表,它存储用户已存储的网站ID。
userwebsite
userid, websiteid
[attributes of the table]
假设用户有兴趣保存microsoft;在他的收藏中,他进入
www.microsoft.com
由于该网站不存在于全局存储库中,因此它首先位于存储库中,然后添加到其集合中。现在这两个表的内容看起来像这样:
website:
id, name, url
1 google http://www.google.com/
2 CNN http://www.cnn.com/
3 SO http://www.stackoverflow.com/
4 msft http://www.microsoft.com
userwebsite:
userid, websiteid
1 4
假设用户有兴趣在他的收藏中保存谷歌,并进入
www.google.com
由于网站已经存在于集合中,而不是将网站添加到集合中,因此只会将引用添加到用户集合中。
卡住的地方,
www.google.com和http://www.google.com/
在语义上他们指向同一个站点,但是当你尝试匹配它们时,它们是2个不同的字符串。在这种情况下我应该如何匹配字符串?
我想到的一个解决方案是,输入网站首先检查网站集合中是否存在域(可能是PATINDEX在这里做得很好),通过这样做,您将获得具有保存域名的站点列表。然后检查任何结果网站中是否存在路径。这是个好主意吗?
此问题是否存在重要解决方案?还有更好的方法吗?
答案 0 :(得分:1)
在这种情况下,您不需要模式匹配,您真正要求的(继续Matteo评论的内容)是一种验证Web地址并以一致方式存储它们的方法。但是如果你想要一个正则表达式来至少确定地址是否有效,你可以看一下:http://www.shauninman.com/archive/2006/05/08/validating_domain_names
或者使用Javascript to validate it虽然您没有说出您在SQL服务器之外使用的语言。
几乎就是这样,您需要将域名发送到域名服务器才能解析,然后再将其存储到您的表中。最好忽略它们是网址的事实,只是将它们视为字符串。例如,您如何确保在数据库中正确比较人名?第一步通常是确保使用大小写;从那时起,处理可能被省略的中间名/首字母变得更加困难。