对象数据库Nosql的在实际应用中的几个优点
本篇仅以mongodb作为nosql讨论内容。
结构性数据库SQL,在实际应用的时候,存在几种常见的问题。
1、结构化设计,在表结构改动时,会很困难。
2、多对多的关系运用,需要额外补充数据表,记录M-N关系,表的数量会增长。
3、分片存储,由于表结构的ID自增长,在每个片的存储中分别自增,数据合并ID冲突,需要独立的解决方案。
mongodb数据库对以上问题的解决方案
1、nosql数据库是以k-v模式存储,每条记录为一份文档,可以任意修改每份文档的内容格式,其存储可以灵活应对外界的变化。
2、M-N的对应关系解决,举例说明:
一个数据线,既属于手机配件类别,也属于电脑配件类别,在查询2种类别的时候,都要展示出这个数据线记录。
SQL中的设计如下
Category类别表 |
cat_id int cat_name varchar(20) |
Insert into category values(1,'电脑配件'),(2,'手机配件');
Product产品表 |
product_id int product_name varchar(50) |
Insert into product values(1,'xx数据线')
Product_Category对应关系表 |
pc_id int product_id int category_id int |
此处建立对应关系
Insert into product_category values(1,1,1),(2,1,2);
我们需要3张表,且m-n的对应关系表中,需要大量的冗余存储。 m*n的存储量。
查询sql需要select *** from xx join2个表,导致索引失效且创建临时表(temp table , file sort),效率问题解决困难。
在mongodb中,可以这样存储
Category分类集 |
{_id : xxxxxxxxxxx1, name: '电脑配件'} {_id : xxxxxxxxxxx2, name: '手机配件'} |
Product产品集 |
{_id : ObjectId(), name: '数据线', cat_ids[xxxxxxxxxxx1,xxxxxxxxxxx2,...]} |
此处使用了mongodb的特性:k-v的键值存储方案,是可以为array类型的多数据,数据存储的时候减少了一个表,3个字段的维护,在查询的时候,避免了多表join,使用单表查询, find({cat_ids:'xxxxxxxxxxx1'}) 即可查询出该类别的相关数据。
3、数据分片
mongodb的_id使用的是ObjectId自动编号规则,以12字节的BSON串格式存储(例如5349b4ddd2781d08c09890f4),其中规则如下
4字节为unix time时间戳 (5349b4dd)
3字节机器识别码 (d2781d)
2字节为进程id (08c0)
3字节随机数 (9890f4)
该存储方案避免了id自增长的分片问题,ObjectId已经存储hash信息,极大的降低系统设计的负责度。
[ 纹绣培训新闻 ]
[ 公开课培训新闻 ]
[ 父母亲子教育培训新闻 ]