讓我們考慮的備選方案的利弊:
其中的所有目錄+表屬性:
- 很寬表 - 很難查看模型&模式定義和表數據
- 一個查詢沒有聯接要求中檢索關於上市(S)的所有數據
- 需要爲每個新的屬性架構+模式的變革。
- 有效的,如果你總是加載所有的屬性和多數項目已大部分屬性的值。根據屬性
- 例LINQ查詢:
context.Listings.Where(l => l.PricePerMonthInUsd < 10e3 && l.SquareMeters >= 200)
.ToList();
一個的所有目錄表中,屬性類型一個表,一個用於(清單的ID +屬性IDS +)值(EAV):
- 清單表是窄
- 有效的,如果數據非常稀疏的(大多數屬性不具備莫值st items)
- 需要從值中提取所有數據 - 一個額外的查詢(或一個連接,但會浪費帶寬 - 將獲取每個屬性值行的基本列表數據)
- 不需要模式+模型更改新屬性
- 如果你想類型安全的訪問通過代碼的屬性,你會基於屬性類型的表需要自定義代碼生成
- 例LINQ查詢根據屬性:
var listingIds = context.AttributeValues.Where(v =>
v.AttributeTypeId == PricePerMonthInUsdId && v < 10e3)
.Select(v => v.ListingId)
.Intersection(context.AttributeVales.Where(v =>
v.AttributeTypeId == SquareMetersId && v.Value >= 200)
.Select(v => v.ListingId)).ToList();
或(比較實際DB的性能)
var listingIds = context.AttributeValues.Where(v =>
v.AttributeTypeId == PricePerMonthInUsdId && v < 10e3)
.Select(v => v.ListingId).ToList();
listingIds = context.AttributeVales.Where(v =>
listingIds.Contains(v.LisingId)
&& v.AttributeTypeId == SquareMetersId
&& v.Value >= 200)
.Select(v => v.ListingId).ToList();
然後:
var listings = context.Listings.Where(l => listingIds.Contains(l.ListingId)).ToList();
妥協的選擇 - 一個表中的所有目錄和每個屬性,包括值的組中的一個表(假設你可以將屬性劃分爲組):
- 多箇中等寬度表
- 如果每組數據稀疏(例如,與花園有關的屬性在沒有花園的情況下全部爲空,因此您不需要爲花園相關表添加行)
- 需要一個包含多個連接的查詢(帶寬不會浪費在連接中,因爲組表爲1:0 .1帶有列表表格,而不是1:很多)
- 要求對新屬性進行模式+模型更改
- 查看模式/模型更簡單 - 如果您可以將屬性劃分爲10個組,則會有25個表在列表中有11列而不是另外250列表
- LINQ查詢位於上述兩個示例之間的某處。
根據您的具體統計數據(關於稀疏),並要求/維護計劃(例如添加多久是屬性類型/改變了嗎?),並決定考慮利弊。
哎呀,對不起,我的意思是EAV(實體 - 屬性 - 值),我會更新我的問題。 – Ricketts
重新標記 - 問題與C#無關 - .NET語言不可知。重要的考慮事項是SQL Server優化,實體框架優化。此外,ASP.NET WCF並不相關,因爲您不必在EF和WCF中使用相同的實體(如果需要,您可以使用映射)。 –