不管是使用哪种语言编程,开发哪个实际项目,数据库设计一直都是开发中十分重要的一部分,数据库的逻辑实现方式决定了数据获取以及存储的逻辑表现,直接影响着数据实现的复杂程度。下面就依仗Party_bid这个项目,谈一下使用浏览器本地存储的三种设计方式。
1、使用单一的大数组嵌套存储所有的相关属性
var two_activities = [ { name: "first activity", sign_ups: [], bids: [] }, { name: "second activity", sign_ups: [ { name:"张三", phone:"13600000000" }, { name:"李四", phone:"15600000000" }, { name:"王五", phone:"13800000000" } ], bids: [ { name:"竞价1", biddings : [ { name: "张三", phone:"13600000000", price: "12" }, { name: "李四", phone:"15600000000", price: "10" } ] }, { name:"竞价2", biddings : [ { name: "张三", phone:"13600000000", price: "10" }, { name: "李四", phone:"15600000000", price: "12" }, { name: "王五", phone:"13800000000", price: "10" } ] } ] }];
这个大数组的每个对象都有三个属性:name(活动名称)、sign_ups(报名数组)、bids(竞价数组)
其中sign_ups数组里的每个对象都有name(报名人姓名)、phone(电话)两个属性;
bids数组里的每个对象都有name(竞价名)、biddings(竞价信息数组)两个属性,其中的biddings数组对象又有name(竞价人姓名)、phone(电话)、price(竞价价格)三个属性。
这种数据结构优点是:逻辑清晰,功能存储关系明确。缺点就是存取时要判断的条件特别多,需要一层一层的剥离。比如我要进行竞价信息的存取,我要获取当前的活动名进行对比,获得该竞价数组,然后再判断查找当前的竞价名称。获得当前的竞价列表,然后再在手机号不重复的情况下,进行存储。
2、使用哈希表存储数据
哈希表是使用key:value这样的键值对来存储的,其中value可以是特定属性,也可以是对象,下面举个例子
1)value直接存属性(网址)
var hash={ "百度" :"http://www.baidu.com/", "Google" :"http://www.google.com/", "微软" :"http://www.microsoft.com/", "博客园" :"http://www.cnblogs.com/", "阿舜的博客" :"http://ashun.cmblogs.com/" };
2)value里存的是对象,对象的分别还有不同的属性
var ht = { "c1" : {"UserID":"userc1","UserName":"usercc1"}, "c2" : {"UserID":"userc2","UserName":"usercc2"}, "c3" : {"UserID":"userc3","UserName":"usercc3"} };
取的时候只需使用ht["c1"]存取对象,使用ht["c1"]["userID"]存取特定属性
3)party_bid哈希表数据存取设计
var two_activities = { "0":{ name: "first activity", sign_ups:[], bids:[], biddings:{} }, "1": { name: "second activity", sign_ups: [ { name:"张三", phone:"13600000000" }, { name:"李四", phone:"15600000000" }, { name:"王五", phone:"13800000000" } ], bids:["竞价1","竞价2"], biddings:{ "竞价1":[ { phone:"13600000000", price: "12" }, { phone:"15600000000", price: "10" } ], "竞价2": [ { phone:"13600000000", price: "10" }, { phone:"15600000000", price: "12" }, { phone:"13800000000", price: "10" } ] } } };
分别使用键值“0”、“1”来区分不同的活动,每个键值对应一个活动对象,对象里分别有name(活动名)、sign_ups(报名信息)、bids(竞价名称)、biddings(竞价信息);
报名信息数组里存储每个报名对象,有name、phone两个属性;
bids里存储产生的竞价名称,biddings竞价信息使用哈希表,使用键值“竞价1”竞价2”来分别对应不同竞价的对象信息,并与bids相对应,存储phone、price属性。
这种数据结构由于键值对的对应关系使得逻辑很清晰,存取也方便。
3、数组分离独立存储
将各个数组分别独立地存储在本地,然后使用id进行关联
var activities = [ { id:"0", name: "first activity" }, { id:"1", name: "second activity" } ];
var sign_ups = [ { name:"张三", phone:"13600000000", activity_id:"0" }, { name:"李四", phone:"15600000000", activity_id:"0" }, { name:"王五", phone:"13800000000", activity_id:"0" }, { name:"张", phone:"13600000000", activity_id:"1" }, { name:"李", phone:"15600000000", activity_id:"1" }, { name:"王", phone:"13800000000", activity_id:"1" } ]
var bids = [ { name: "竞价1", activity_id:"0", biddings:[ { phone:"13600000000", price: "9" }, { phone:"15600000000", price: "10" } ] }, { name: "竞价1", activity_id:"1", biddings:[ { phone:"13600000000", price: "12" }, { phone:"15600000000", price: "10" } ] }, { name: "竞价2", activity_id:"1", biddings:[ { phone:"13600000000", price: "10" }, { phone:"15600000000", price: "12" }, { phone:"13800000000", price: "10" } ] } ];
分别定义activity数组存储activity的id和活动名;定义报名数组存储报名信息,并且定义activity_id属性关联报的活动;竞价数组定义竞价的竞价名、对应的活动id,以及竞价信息数组,存储竞价的电话和价格。
这种数据结构的特点是每个数组之间有各自的功能属性,各个数组之间的关系使用id来关联。关系,这种需要理清逻辑关系,只要关系理清了,存取是十分简单的。
总的来说,个人认为这三种数据存储方式各有特点,第一种存取比较复杂,不太建议用,但是对于初学者来说清晰的逻辑关系一目了然。第二种键值对逻辑清晰,存取灵活,相互的关联关系也比较明确。建议使用。第三种,数据独立性强,只是判断逻辑关系时要仔细一一对应,可能会出现粗心的错误,数据存储时认真就好,熟练了也就挺简单的了。