Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对于这种情况,最好的数据库结构是什么?_Sql Server_Database_Entity Framework_Database Design_Domain Model - Fatal编程技术网

Sql server 对于这种情况,最好的数据库结构是什么?

Sql server 对于这种情况,最好的数据库结构是什么?,sql-server,database,entity-framework,database-design,domain-model,Sql Server,Database,Entity Framework,Database Design,Domain Model,我有一个数据库,是持有房地产MLS(多重上市服务)的数据。目前,我有一个表,其中包含所有列表属性(price、address、sqft等)。有几种不同的房地产类型(住宅、商业、租赁、收入、土地等),每种房地产类型共享大多数属性,但也有一些是该房地产类型特有的 我的问题是共享属性超过了250个字段,这似乎太多了,无法在一个表中包含。我的想法是,我可以将它们分解成EAV(实体属性值)格式,但我读过很多关于这一点的不好的东西,这会让运行查询变得非常痛苦,因为250个字段中的任何一个都可以搜索。如果我要

我有一个数据库,是持有房地产MLS(多重上市服务)的数据。目前,我有一个表,其中包含所有列表属性(price、address、sqft等)。有几种不同的房地产类型(住宅、商业、租赁、收入、土地等),每种房地产类型共享大多数属性,但也有一些是该房地产类型特有的

我的问题是共享属性超过了250个字段,这似乎太多了,无法在一个表中包含。我的想法是,我可以将它们分解成EAV(实体属性值)格式,但我读过很多关于这一点的不好的东西,这会让运行查询变得非常痛苦,因为250个字段中的任何一个都可以搜索。如果我要走这条路,我必须从EAV表中取出所有数据,按清单id分组,在应用程序端合并,然后对内存中的对象集合运行查询。这似乎也不是很有效

我正在寻找一些关于如何进行的想法或建议。也许250+字段表是唯一继续的方法

请注意,我使用的是SQL Server 2012、.NET 4.5 w/Entity Framework 5、C#,数据通过WCF服务传递给asp.NET web应用程序

提前谢谢。

我可能会做什么:

我首先为250个字段创建一个表,其中有ID和字段名,例如:

price   -> 1
address -> 2
sqft    -> 3
此表还将在我的代码中硬编码为enum,并用于查询

然后在主表中,我有两个字段,一个是字段ID的类型,从上表中获取,第二个是它的值,例如

Line1: 122(map id), 1 (for price), 100 (the actually price)
Line2: 122(map id), 2 (for address), "where is it" 
Line3: 122(map id), 3 (for sqft), 10 (sqft)
这里的问题是,您可能至少需要两个字段,一个用于数字,一个用于字符串


这当然是一个建议。

让我们考虑一下备选方案的利弊:

所有列表和属性的一个表:

  • 非常宽的表-很难查看模型和模式定义以及表数据
  • 检索列表中的所有数据所需的一个不带联接的查询
  • 需要对每个新属性进行架构+模型更改
  • 如果您总是加载所有属性,并且大多数项目的大多数属性都有值,则效率很高
  • 根据属性的LINQ查询示例:
  • context.Listings.Where(l=>l.pricepermontinusd<10e3&&l.squameters>=200)
    .ToList();
    

    一个表用于所有列表,一个表用于属性类型,一个表用于(列表ID+属性ID+)值(EAV):

  • 列表很窄
  • 如果数据非常稀疏(大多数属性对于大多数项没有值),则效率很高
  • 需要从值中获取所有数据-一个额外的查询(或一个连接,但这会浪费带宽-将获取每个属性值行的基本列表数据)
  • 不需要对新属性进行架构+模型更改
  • 若希望通过代码对属性进行类型安全访问,则需要基于属性类型表生成自定义代码
  • 根据属性的LINQ查询示例:
  • var listingIds=context.attributeValue.Where(v=>
    v、 AttributeTypeId==PricePerMontinusId&&v<10e3)
    .Select(v=>v.ListingId)
    .Intersection(context.AttributeVales.Where(v=>
    v、 AttributeTypeId==SquareMetersId&&v.值>=200)
    .Select(v=>v.ListingId)).ToList();
    
    或:(比较实际DB上的性能)

    var listingIds=context.attributeValue.Where(v=>
    v、 AttributeTypeId==PricePerMontinusId&&v<10e3)
    .Select(v=>v.ListingId).ToList();
    listingIds=context.AttributeVales.Where(v=>
    listingId.Contains(v.LisingId)
    &&v.AttributeTypeId==SquareMetersId
    &&v.值>=200)
    .Select(v=>v.ListingId).ToList();
    
    然后:

    var listings=context.listings.Where(l=>listingIds.Contains(l.ListingId)).ToList();
    

    折衷选项-一个表用于所有列表,每组属性(包括值)一个表(假设您可以将属性划分为多个组):

  • 多个中等宽度表格
  • 如果每个组的数据稀疏,则效率很高(例如,对于没有花园的列表,与花园相关的属性都为空,因此您不需要为它们在与花园相关的表中添加行)
  • 需要一个具有多个联接的查询(联接中不会浪费带宽,因为组表与列表表是1:0..1,而不是1:many)
  • 需要对新属性进行架构+模型更改
  • 使查看模式/模型变得更简单-如果可以将属性划分为10个组,那么列表表中将有25个表,其中11列,而不是另外250列
  • LINQ查询介于上述两个示例之间


  • 根据您的具体统计(关于稀疏性)和要求/可维护性计划(例如,属性类型增加/更改的频率),并考虑决定是否正确和优劣。< /P> < P>我将创建只包含共享属性的<代码>清单>代码>表。此表将有
    listingId
    作为主键。它将有一个列来存储列表类型,以便您知道它是否是住宅列表、登录列表等

    然后,为每个子类型创建一个额外的表。因此,您将有用于
    住宅清单
    土地清单
    等的表格。所有这些表格的主键也将是
    列表ID
    。此列也是
    列表
    的外键

    当您希望对共享数据进行操作时,完全可以从
    列表中执行此操作。当您对特定数据感兴趣时,您将加入特定表。一些怪癖