使用Microsoft SQL Server

时间:2015-12-19 14:06:51

标签: c# asp.net-mvc database 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

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

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

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

组织1 - >项目表

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

组织2 - >项目表

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

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

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

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

但由于动态表名,获取项目(名称或邀请代码)的搜索结果会更复杂。我在How to fetch data from dynamic multiple tables?找到了这个链接,所以我认为这不是一个更好的解决方案,因为搜索需要非常快。

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

问题:

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

工具和技术:

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

2 个答案:

答案 0 :(得分: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
')

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

答案 1 :(得分:2)

如果您想要更快的查找,可以通过在写入/插入时间内进行妥协来实现。 以下三点:

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

首先,正如你所说的那样直截了当。让我们看看2和3.我会建议一种通用的方法,你可以通过它来处理这两个点,让我们以地址为例。

  1. 使用AddressId和Address列创建表地址,在此表中仅存储唯一地址​​。您可以将地址设为唯一键。将addressId存储在Organization和Project表中,而不是完整地址。这将节省空间并避免拼写错误
  2. 使用列id,AddressId,ProjectId和OrganisationId创建表OrganisationAddressMap。在此表中仅存储唯一的行
  3. 当您搜索地址时,请在上面的两个表中查找相关的projectId和OrganisationId。然后基于这两个id查询正确的表。
  4. 在上面的场景中,您将搜索非常少的地址行数。同样,为每个查询术语创建两个表,如项目名称,项目邀请代码,城市,州和国家。