使用Microsoft SQL Server从动态表中搜索数据

Cha*_*van 6 c# database asp.net-mvc database-design sql-server-2012

我有一个这样的组织表:

OrgID | OrgInviteCode | OrgName       | Status | ProjectTableName | InsertOn
-------------------------------------------------------------------------------------------
 1    | RC12T67       | Organization1 | Active |  Project1        | 2015-12-19 15:37:43.333
 2    | BC56uI7       | Organization2 | Active |  Project2        | 2015-12-19 15:37:43.333
 3    | ORG1456       | Organization3 | Active |  Project3        | 2015-12-19 15:37:43.333
 4    | ORG2856       | Organization4 | Active |  Project4        | 2015-12-19 15:37:43.333
Run Code Online (Sandbox Code Playgroud)

我有一个存储过程来为项目创建动态表.

如果成功创建了任何新组织,那么我们调用存储过程为该组织创建项目表.

每个组织都有自己的项目表.因此项目表名称对于每个组织都是动态的,并且它的名称存储在组织表中.

Organization1 - >项目表

ProjectID | OrgID | ProjectName | ProjectInvideCode |   Address1        | Address2 |  City      |State    |   ZIP      |  Country
-------------------------------------------------------------------------------------------------------------------------------
1         |   1   |  Org1Proj1   |  XJ34590         | 235 Harrison St. |            | Syracuse  | AK      |  23456234    |  US
2         |   1   |  Org1Proj2   |  JKI8907         | 35 Sterling  St. |            | Syracuse  | NY      |  23456456    |  US
Run Code Online (Sandbox Code Playgroud)

Organization2 - >项目表

ProjectID | OrgID | ProjectName | ProjectInvideCode |   Address1 | Address2 |  City       |State    |   ZIP    |  Country
-------------------------------------------------------------------------------------------------------------------------------
1         |   2   |  Org2Proj1   |  RUIO90          | 90 Ram St. |          | Los Angeles | CA    |  23456234    |  US
2         |   2   |  Org2Proj2   |  KLOP907         | 35 Wide St.|          | Chicago     | IL    |  23456456    |  US
Run Code Online (Sandbox Code Playgroud)

我目前正致力于整合搜索功能.用户或匿名用户可以根据以下逻辑搜索数据:

  • 使用组织名称或组织邀请代码进行搜索.
  • 使用项目名称或项目邀请代码进行搜索.
  • 搜索项目地址,城市,州,国家

我知道找到组织名称和邀请代码的搜索结果非常简单,因为所有内容都驻留在同一个表中.

但由于动态表名,获取项目的搜索结果(名称或邀请代码)会更复杂.我在如何从动态多表中获取数据中找到了这个链接,所以我认为这不是一个更好的解决方案,因为搜索需要非常快.

我们之所以基于组织分离项目表是因为在我们的要求中他们明确提到"我们有1000000个组织,但每个组织有超过100万个项目".希望您理解我们不希望在单个表中转储1000000(组织)*1百万= XXXXXX项目的概念.

问题:

  • 我们如何以有效的方式搜索项目数据?
  • 我们的项目单独表概念是否最差?你有什么建议可以处理得更好吗?
  • 在C#中有没有有效的方法?

工具和技术:

  • Asp.Net 4.5,C#
  • MVC 5
  • 首先是实体框架代码
  • SQL Server 2012

Ale*_* Yu 5

我认为您可以创建组合所有项目表的VIEW

SELECT
    REPLACE(
        REPLACE( 
            REPLACE(
            (
                SELECT DISTINCT 'SELECT * FROM Organization O JOIN ' 
                    + ProjectTableName  
                    + ' PT ON O.OrgId = PT.OrgId WHERE O.OrgId = ' + convert(varchar(10), OrgId) 
                    as [text()] FROM Organization
                FOR XML PATH ('DELIMITER')  
            ), '</DELIMITER><DELIMITER>', ' 
            UNION ALL 
            '), '</DELIMITER>', '')
    ,'<DELIMITER>', 'CREATE VIEW Organization_Projects 
AS
')
Run Code Online (Sandbox Code Playgroud)

对源表的查询效率必须非常接近.