Sql server 对于这种情况,最好的数据库结构是什么?
我有一个数据库,是持有房地产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和字段名,例如: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个字段中的任何一个都可以搜索。如果我要
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)
这里的问题是,您可能至少需要两个字段,一个用于数字,一个用于字符串
这当然是一个建议。
让我们考虑一下备选方案的利弊:
所有列表和属性的一个表:context.Listings.Where(l=>l.pricepermontinusd<10e3&&l.squameters>=200)
.ToList();
一个表用于所有列表,一个表用于属性类型,一个表用于(列表ID+属性ID+)值(EAV):
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();
折衷选项-一个表用于所有列表,每组属性(包括值)一个表(假设您可以将属性划分为多个组):
根据您的具体统计(关于稀疏性)和要求/可维护性计划(例如,属性类型增加/更改的频率),并考虑决定是否正确和优劣。< /P> < P>我将创建只包含共享属性的<代码>清单>代码>表。此表将有
listingId
作为主键。它将有一个列来存储列表类型,以便您知道它是否是住宅列表、登录列表等
然后,为每个子类型创建一个额外的表。因此,您将有用于住宅清单
,土地清单
等的表格。所有这些表格的主键也将是列表ID
。此列也是列表
的外键
当您希望对共享数据进行操作时,完全可以从列表中执行此操作。当您对特定数据感兴趣时,您将加入特定表。一些怪癖