Sql server 关于sql Server db使用的建议没有可用的阵列?

Sql server 关于sql Server db使用的建议没有可用的阵列?,sql-server,Sql Server,我有以下要求,希望有人能提供一个关于如何在SQL Server中实现这一点的一般指南: 用法 用户注册该网站 然后我根据用户的位置匹配这些用户。所以两个亲密的用户是匹配在一起的 匹配数不清楚,一个区域中可能有0或1000个用户匹配 要求 对于每个用户,将所有匹配项放在一个记录中。既然SQL Server没有数组的概念,我该怎么做?也许是物体 稍后在网站中,我需要根据时间、距离等对特定用户的匹配项进行排序 如果您的需求是真实的,那么唯一的方法就是使用包含所有匹配项的XML列,或者使用逗号分隔的所有

我有以下要求,希望有人能提供一个关于如何在SQL Server中实现这一点的一般指南:

用法
  • 用户注册该网站
  • 然后我根据用户的位置匹配这些用户。所以两个亲密的用户是匹配在一起的
  • 匹配数不清楚,一个区域中可能有0或1000个用户匹配
  • 要求
  • 对于每个用户,将所有匹配项放在一个记录中。既然SQL Server没有数组的概念,我该怎么做?也许是物体
  • 稍后在网站中,我需要根据时间、距离等对特定用户的匹配项进行排序

  • 如果您的需求是真实的,那么唯一的方法就是使用包含所有匹配项的XML列,或者使用逗号分隔的所有匹配项列表


    您可能想了解为什么要求将所有匹配项都放在一行中。调用者将如何使用一行中的所有匹配项?

    您对“关闭”用户的定义是什么?郊区,邮编,城市

    1) 如果是上述情况之一,则会使整个过程过于复杂,因为您所要做的就是选择[zip、city、Suburban,…]=“X”处的所有用户,然后您可以按照@Paul Sasik的建议执行操作,并将其插入单独的表中,或者创建一个视图或存储过程,以便在需要时为您检索这些用户

    2) 您几乎需要另一个表(或规则)来定义在时间、距离等方面的接近程度,并有一种方法来查找和比较记录。一旦可以这样做,就可以创建一个用户定义的函数,用于查询


    @John S,我不同意XML是“唯一”的方式。

    你的基本假设是错误的

    SQL确实有数组。事实上,allSQL拥有的是数组;因为表是一个数组

    让我解释一下。数组是一个值序列。表也是一个值序列(如果有提供序列信息的列,则为顺序)

    对于您的示例,假设您有一个用户表

    UserID, UserName
    
    在此表中,每行代表一个用户。您不希望有两行具有相同的userID


    您可以通过创建另一个表来将每个用户与一个用户数组“关联”,该表是他们所接近的用户数组

    UserID, NearUserID, [Distance]
    
    在这种情况下,该表将有多个具有相同用户ID的行。这将创建您的数组。如果需要订购,可以添加序列或订单列


    下面是一些SQL希望看到每个用户及其所有近距离用户的情况:

    SELECT *
    FROM Users
    JOIN NearUsers ON Users.UserID = NearUsers.NearUserID
    
    希望这有帮助


    假设您希望使用一个在两个方向上匹配用户的表将记录一分为二(请参见注释)

    UserID1, UserID2
    
    然后,上面的SQL可以更改为

    SELECT Users.UserID, COALESCE(U1.UserID2,U2.UserID1) AS NearUser
    FROM Users
    JOIN UsersNear U1 ON Users.UserID = UserID1
    JOIN UsersNear U2 ON Users.UserID = UserID2
    

    这将比为每个用户创建一个数组更小(不是为每个用户存储一个数组,而是为关系存储一个数组),而且效率更高。

    为什么匹配需要进入一个记录?RDBMS中最自然的事情是创建另一个存储这些数据的表。这将特别有帮助,因为你需要在应用程序的另一部分对数据进行排序。有一个单独的表。如何处理1000个用户同时匹配的情况?这将导致1000*1000=1000 000条记录!Sql Server将在一个表中处理一百万条记录,而不存在任何问题。如果不是这样的话,就不会有多大的分贝了。(请记住为列编制索引。)对,仅举一个例子说明1000个用户将产生100000条记录。当有10000或100000个用户时会发生什么,db会不会崩溃?基本上它是一个用户匹配站点(基于位置)。因此,每个用户都有一个匹配列表。是否要使用MS SQL执行此操作?MS SQL中的XML列是如何工作的?ThanksAn XML列就是它听起来的样子:一个可以包含XML的列。假设您只需要一个匹配ID,您可以返回类似于
    12
    的内容。您同意此解决方案比链接表占用更多存储空间吗?@Hogan:可能吧,但他说所有内容都必须在一行中。谢谢您的回答。我实际上根据地理编码点匹配用户。因此,每个用户都有一个半径为x公里的匹配列表。是否要将匹配列表存储在某种数组中?当您开始谈论数组时,会想到CLR函数。如果您有一个确定“接近度”的方法(规则),但在T-SQL中找不到这样做的方法,那么您可以始终使用CLR函数并在C#中进行。否则,(我从未使用过),您可以使用SQL Server中的空间列类型,看看这是否对您有帮助。嗨,Hogan,谢谢您的回答。这就是我目前拥有的。但是想象一下,有1000个用户,并且所有用户都是匹配的。这将产生一个包含1000*1000=1000 000条记录的新表!!!这就是我试图解决的问题。再次感谢。仍然需要一个表——将表命名为user1和user2,然后编写代码,您可以在其中加入第一个用户或第二个用户。那你就有一半的记录了。不要担心SQL中的记录太多。即使1000000条记录也是一个很小的数据库。请解释“SQL确实有数组。事实上,所有SQL都有数组;因为一个表就是一个数组”-您是在试图说明一个观点,还是在尝试技术,因为在引擎盖下面,SQL不是一个数组。从抽象数据类型的角度来看(我相信OP指的是SQL没有数组,我需要解决一个算法),SQL有数组——元素的有序集合,可以通过索引选择。在任何需要数组的算法的上下文中,SQL都有数组。请注意,您的意思不是“解释”,而是“防御”我并不是想从技术上或举例说明一点——我只是想帮助OP解决他的问题(这显然应该用SQL中的表来完成)