我们都知道在一些大的商城项目或者需要用到大量数据的项目中,数据库中表结构非常复杂,表和表之间的映射更是繁琐用主外键确实可以处理这种复杂的联系,但是主外键在修改、删除数据时,有时会很麻烦。
这个时候就有人提出在数据库中直接存入json数据,这样做不但可以大大在保证表和表之间联系的密切,而且更可以省去数据库中大量字段的产生,减少数据库的负载和
有人提出理论,就有人用代码实现!!
那么有几点问题我们需要去思考一下
用json方式保存数据入库,有什么优点
1.想增加或减少字段时,不必频繁地去修改数据库,尤其 是使用三层框架,改一个字段要改好多内容的。(如果你在数据库中进行统计的话,最好还是遵循 3NF 原则, 直接存 json 基本上不符合 1NF 。如果你的这个数据只是在web 上用 js 来处理的话,还会是个不错的选择)
2.在查询相关信息时不必用联合查询,避免使用主外键,(主外键在修改、删除数据时,有时会很麻烦的)
使用方法
具体思路
所有的对json一切操作都在前端进行,返回给后端的是有数据库表字段的json数据,所以后端只负责对数据库表进行操作
相关函数json_encode和json_decode
//json_encode顾名思义json编码,就是将数组或对象,编码成json字符串的函数
$arr[‘a’] = 1;
a
r
r
[
′
b
′
]
=
2
;
v
a
r
d
u
m
p
(
j
s
o
n
e
n
c
o
d
e
(
arr['b'] = 2; var_dump(json_encode(
arr[′b′]=2;vardump(jsonencode(arr));
class obj { }$obj = new obj;
$obj->a = 1;
o
b
j
−
>
b
=
2
;
v
a
r
d
u
m
p
(
j
s
o
n
e
n
c
o
d
e
(
obj->b = 2; var_dump(json_encode(
obj−>b=2;vardump(jsonencode(obj));
//这两条打印结果是一样的//string ‘{“a”:1,“b”:2}’ (length=13)
//而json_decode刚好相反,是将json字符串转成数组或对象//因为两组打印结果一样,所以我们任意取一组继续下面的实验
j
s
o
n
s
t
r
=
j
s
o
n
e
n
c
o
d
e
(
json_str = json_encode(
jsonstr=jsonencode(obj);
//现在使用json_decode来对这组json格式的字符串进行操作//第一次不加第二参数var_dump(json_decode(
j
s
o
n
s
t
r
)
)
;
/
/
打
印
结
果
为
对
象
/
/
o
b
j
e
c
t
(
s
t
d
C
l
a
s
s
)
[
3
]
/
/
p
u
b
l
i
c
′
a
′
=
>
i
n
t
1
/
/
p
u
b
l
i
c
′
b
′
=
>
i
n
t
2
/
/
第
一
次
加
第
二
参
数
v
a
r
d
u
m
p
(
j
s
o
n
d
e
c
o
d
e
(
json_str)); //打印结果为对象//object(stdClass)[3]// public 'a' => int 1// public 'b' => int 2 //第一次加第二参数var_dump(json_decode(
jsonstr));//打印结果为对象//object(stdClass)[3]//public′a′=>int1//public′b′=>int2//第一次加第二参数vardump(jsondecode(json_str,true));//打印结果为数组//array (size=2)// ‘a’ => int 1// ‘b’ => int 2