每个数据库单元保存多个项目

时间:2010-05-13 09:45:55

标签: c# asp.net sql sql-server

我有一个国家/地区列表。每个用户都可以查看多个国家。保存后,此“用户国家/地区列表”将用于确定其他用户是否适合某些用户选择的国家/地区。

问题是解决这个问题最有效的方法......

我有一个,一个用户选择作为分隔列表,如加拿大,美国,法国......在单个varchar(max)字段中,但问题是,一旦来自德国的用户进入页面我执行此检查。要搜索德国,我需要获取所有项目并取消分隔每个字段以检查值或使用sql'like'再次非常缓慢..

如果您有更好的解决方案或一些提示,我会很高兴听到。

为了确保,许多用户将拥有他们自己选择的国家/地区,并且只有他们希望用户登陆他们的页面。数百万用户将访问这些页面。所以更快的方法会更好。

技术,MSSQL和ASP.NET

感谢

5 个答案:

答案 0 :(得分:10)

您不应在一个单元格中存储值列表。考虑使用一个单独的表来存储每个选定国家/地区,并使用对用户表的外键引用。这是标准Database Normalization

不要沿着你想到的路线走下去,在一个字段中存储多个条目。我不得不重新编写更多应用程序,因为数据库设计不好而不是出于任何其他原因,这是一个糟糕的设计。

<强>加

我在工作的墙上贴了这张海报:http://www.informationqualitysolutions.com/FreeStuff/rettigNormalizationPoster.pdf

我的一位前任是DB Design的新手,这对她很有帮助。我会为任何可能需要它的新员工保留它。它通过示例很好地解释了规范化。

答案 1 :(得分:4)

将分隔字段保存到数据库中。您的数据库不是normalized

您需要为用户和国家/地区提供多对多表:

UserId
CountryId

如果您确实开始使用分隔字段,则最终需要解析它(在SQL或您的代码中)。查询和优化更加困难。

答案 2 :(得分:3)

在这种情况下,您希望创建一个名为UserCountries(或某些此类)的表,该表将存储UserID和CountryID。这是一个标准的关系结构。对于初学者来说,它似乎很奇怪而且过于复杂,但是这种结构使得针对这种类型的数据编写灵活的查询变得非常容易和快速。不需要划界!

答案 3 :(得分:1)

我认为最好使用UserCountry表,其中包含指向UserCountry表的链接。这为查询数据库创造了更多可能性。以这种方式更简单的示例查询:

  • 每个用户的国家/地区数
  • 选择特定国家/地区的所有用户
  • 对所有热门国家/地区进行排序

答案 4 :(得分:0)

不要将多个国家/地区存储在一个字段中。添加2个附加表 - 国家(ID,名称)和UserCountries(UserID,CountryID)