2015-11-08 30 views
0

可以說我在這個結構中的SQL數據庫中的表USER:LinQ將使用JSON字符串

FirstName LastName Age Address 
------------`----------- ----- ---------------------------------------------------------------------------------------------------- 
Homer  Simpson  40 {"streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100"} 
Homer  Simpson  40 {"streetAddress": "742 Evergreen Terrace", "city": "Springfield", "state": "NV", "postalCode": "89001"} 

我想創建一個LINQ查詢來獲取所有的辛普森住在內華達州。 我使用VB.NET和Entity Framework,所以我開始的DbContext:

dbContext.Users.Where(Function(f As User) f.FirstName = "Homer", 
              f.LastName = "Simpsom", 
              f.Address.Contains("\"state\": \"NV\"")) 'This is where I block 

這是正確的嗎?是的,但這是做這件事的好方法嗎?

回答

2

您在數據庫模式中所做的工作是以關係,行/列SQL格式構建數據,並將一列數據放在結構化爲鍵值文檔中。當然,這限制了你智能地查詢內部JSON數據的能力,而且你依賴於一個簡單的子字符串搜索,它很脆弱 - 如果在「狀態」和「NV」之間沒有空格,會發生什麼?您的查詢可能會中斷。

改善此問題的一種可能性是將JSON分解爲關係結構。從您的示例數據看來,您的數據似乎相對簡單。您可以創建一個Address表,將JSON保存到其中,將每個字段保存到列中,並將其鏈接到用戶表 - 甚至將地址列直接放在用戶表中。

順便提一句,JSON並不是我見過的人使用的唯一的非關係分層鍵值格式。 MS SQL自2005年以來支持XML類型的字段,並且包含特殊語法來智能地查詢XML。我以類似的方式看到MS SQL 2016 will support JSON,允許您在該字段中查詢數據,而不是文本。但是,我不知道其他數據庫是否也有這種支持。

+0

有很多其他數據庫已經支持JSON。 –