簡介
在計算機科學中,名值對,也可以稱為鍵值對或屬性值對,是一種基本的數據表示在計算系統和應用程式中。設計人員通常希望開放式的數據結構,可以在未修改現有的代碼或數據的情況下進行未來擴展。在這種情況下,數據模型的全部或部分可以表示為元組的集合< name,value >;每個元素都是名值對,根據特定應用程式和程式設計師選擇的實現。一些常見的套用有電子郵件、在網址中查詢字元串、一些資料庫系統 - 鍵值數據、Windows註冊表和OpenStreetMap映射數據。一些計算機語言把名值對作為標準語言特徵來實現名值對,或更頻繁的名值對集合。
數據模型
數據模型(Data Model)是數據特徵的抽象,是資料庫管理的教學形式框架。資料庫系統中用以提供信息表示和操作手段的形式構架。數據模型包括資料庫數據的結構部分、資料庫數據的操作部分和資料庫數據的約束條件。數據(Data)是描述事物的符號記錄。模型(Model)是現實世界的抽象。
數據模型所描述的內容包括三個部分:數據結構、數據操作、數據約束。
1)數據結構:數據模型中的數據結構主要描述數據的類型、內容、性質以及數據間的聯繫等。數據結構是數據模型的基礎,數據操作和約束都基本建立在數據結構上。不同的數據結構具有不同的操作和約束。
2)數據操作:數據模型中數據操作主要描述在相應的數據結構上的操作類型和操作方式。
3)數據約束:數據模型中的數據約束主要描述數據結構內數據間的語法、詞義联系、他們之間的制約和依存關係,以及數據動態變化的規則,以保證數據的正確、有效和相容。
元組與集合
元組是關係資料庫中的基本概念,關係是一張表,表中的每行(即資料庫中的每條記錄)就是一個元組,每列就是一個屬性。 在二維表里,元組也稱為記錄。
在離散數學中,集合是對象的一個無序的聚集,對象也稱為集合的元素或成員,集合包含它的元素。我們用 來表示a是集合A中的一個元素。而記號a∉A 表示a不是集合A中的一個元素。
名值對存儲
名值對存儲是資料庫最簡單的組織形式。基本上所有的程式語言都帶有套用在記憶體中的鍵值對存儲。C++STL的映射容器(map container)和Java的HashMap以及Python的字典類型都是名值對存儲。名值對存儲通常都有如下接口:
Get( key ): 獲取之前存儲於某標示符“key”之下的一些數據,或者“key”下沒有數據時報錯。
Set( key, value ): 將“value”存儲到存儲空間中某標示符“key”下,使得我們可以通過調用相同的“key”來訪問它。如果“key”下已經有了一些數據,舊的數據將被替換。
Delete( key ): 刪除存儲在“key”下的數據。
大部分低層實現都是使用哈希表或者某種自平衡樹(例如B-樹或者紅黑樹)。有時候數據太大而不裝不進記憶體,或者必須維持數據謹防系統因為未知原因而崩潰。在這些情況下,就必須使用到檔案系統。
名值對存儲是NoSQL運動的一部分,NoSQL將所有不使用基於關係型資料庫概念的資料庫系統組合在一起。維基百科上的NoSQL詞條很好的總結了這些資料庫的特徵。
不使用SQL查詢語言。
可不全面支持ACID(原子性、一致性、隔離性、持久性)。
可提供分散式、容錯強的結構。
Json的名值對及示例
數據類型,從結構上看,所有的數據最終都可以分成三種類型:
第一種類型是scalar(標量),也就是一個單獨的string(字元串)或數字(numbers),比如“北京”這個單獨的詞。
第二種類型是sequence(序列),也就是若干個相關的數據按照一定順序並列在一起,又叫做array(數組)或List(列表),比如“北京,東京”。
第三種類型是mapping(映射),也就是一個名/值對(Name/value),即數據有一個名稱,還有一個與之相對應的值,這又稱作hash(散列)或dictionary(字典),比如“首都:北京”。
Json格式規則:(DouglasCrockford提出的)
1) 並列的數據之間用逗號(“,”)分隔。
2) 映射用冒號(“:”)表示。
3) 並列數據的集合(數組)用方括弧("[]")表示。
4) 映射的集合(對象)用大括弧(“{}”)表示。
“北京市的面積為16800平方公里,常住人口1600萬人。上海市的面積為6400平方公里,常住人口1800萬。”
寫成json格式就是這樣:
[
{
"城市": "北京",
"面積": 16800,
"人口": 1600
},
{
"城市": "上海",
"面積": 6400,
"人口": 1800
}
]
如果事先知道數據的結構,上面的寫法還可以進一步簡化:
[
[
"北京",
16800,
1600
],
[
"上海",
6400,
1800
]
]
驗證JSON數據格式是否正確,http://www.jsonlint.com/ 這個線上編輯器可以驗證
訪問數據元素
var myObject = { 'color' : 'blue' };
myObject.color;或者myObject[“color”]兩種方式,
var employees = { "accounting" :[ // accounting is an array inemployees.
{"firstName" : "John",// First element
"lastName" :"Doe",
"age" : 23 },
{"firstName" : "Mary",// Second Element
"lastName" :"Smith",
"age" : 32 }
], // End"accounting" array.
"sales" : [ // Sales is another array inemployees.
{"firstName" : "Sally", // First Element
"lastName" :"Green",
"age" : 27 },
{"firstName" : "Jim",// Second Element
"lastName" :"Galley",
"age" : 41 }
] // End"sales" Array.
} // End Employees
訪問數據元素:employees.sales[0].firstName,代表sales數組中第一個firstName元素Sally
employees.sales[1].firstName,代表sales數組中第二個firstName元素Jim。