Sql server 数据类型规范化与查询性能

Sql server 数据类型规范化与查询性能,sql-server,database,entity-framework-5,Sql Server,Database,Entity Framework 5,我正在从事一个相当大的应用程序项目,我正在设置我的数据库以允许执行良好的查询。我有一个规范化的数据库结构,我知道随着数据集的增长,它会导致速度问题。我的数据库使用实体框架映射到我的ASP MVC项目。让我举一个我所面临的困境的例子: 我有一张桌子,我们把它叫做建筑建筑物可以是许多不同的类型,例如房屋、公寓、酒店、汽车旅馆等。然后,每栋建筑物都有大约20个可能的多对一子属性(例如评论、评论、电话号码等)。现在每种类型建筑的数量可能会有很大的不同,比如说,我预计只有100套公寓,但有100000套房

我正在从事一个相当大的应用程序项目,我正在设置我的数据库以允许执行良好的查询。我有一个规范化的数据库结构,我知道随着数据集的增长,它会导致速度问题。我的数据库使用实体框架映射到我的ASP MVC项目。让我举一个我所面临的困境的例子:

我有一张桌子,我们把它叫做建筑<代码>建筑物可以是许多不同的类型,例如房屋、公寓、酒店、汽车旅馆等。然后,每栋建筑物都有大约20个可能的多对一子属性(例如评论、评论、电话号码等)。现在每种类型建筑的数量可能会有很大的不同,比如说,我预计只有100套公寓,但有100000套房子。如果我这样布置我的结构:

备选案文1:

buildings---->(condos, houses, etc)----->many-to-one properties.
如果保存建筑类型的表的中间层只包含对建筑的外键引用(或等效地,将建筑类型作为建筑的一列包含在内),那么这意味着如果我想搜索房屋类型,我必须不必要地搜索建筑物表中的大量记录

优点:不太复杂的应用程序逻辑和数据库

缺点:使简单的查询速度变慢,建筑物表的损坏可能会影响整个应用程序

备选案文2:

(condos, houses, etc)----->many-to-one properties.
完全跳过“建筑”表,并为每种建筑类型创建一个单独的表。每个表的数据结构都是相同的,但其中存储的数据对于每个表都是唯一的(因此仍然是标准化的)。这里的问题是,我需要为每种建筑类型的20+多对一属性创建表

优点:无论其他类型大小如何,对较小类型的查询速度都很快,所有类型都不会出现单点故障,必要时可以对每种类型应用自定义规则,必要时可以应用不同的索引(例如,可能经常删除的类型的非聚集索引,例如可供出租的建筑物)

缺点:更复杂的应用程序逻辑(可能通过存储过程接口减少)和数据库结构


考虑到这些折衷,您认为在能够支持大约40000个并发用户的应用程序中,哪种数据结构更有价值?有没有其他方法可以完全做到这一点

理想情况下,您应该为插入、更新和删除保留一个高度规范化的操作数据库,以最大限度地减少重复和异常,并提高完整性和插入/更新/删除性能

然后,您可以拥有一个非规范化的数据仓库样式的数据库,用于跨多个服务器进行选择、搜索、分析


您可以通过使用物化视图创建非规范化查询来简化仓库的ETL,并按计划(例如每天晚上)刷新物化视图

你考虑过像MongoDb这样的nosql数据库吗?我考虑过,但它会降低使用实体框架和ASP.NET MVC的好处,更不用说数据是自然关系型的,因此需要一个RDBMS。在这种情况下,40000个并发用户是一个大挑战。nosql可以使用商品,但RDBMS在后端需要最先进的服务器。是的,但我使用的服务器集群设置为始终处于高可用性状态,因此暂时让我们假设并发性不是问题所在。去规范化一切。选项1和2都是规范化的,尽管我认为选项2“更”规范化。那么你会建议选择2吗?