MongoDB模式设计介绍.ppt
SchemaDesignBasicsRogerBrogerbAbriefhistoryofDataModelingISAMCOBOLNetworkHiearchicalRelational1970E.F.Coddintroduces1stNormalForm(1NF)1971E.F.Coddintroduces2ndand3rdNormalForm(2NF,3NF1974Codd&BoycedefineBoyce/CoddNormalForm(BCNF)2002Date,Darween,Lorentzosdefine6thNormalForm(6NF)ObjectSowhymodeldata?ModelinggoalsGoals:Avoidanomalieswheninserting,updatingordeletingMinimizeredesignwhenextendingtheschemaMakethemodelinformativetousersAvoidbiastowardsaparticularstyleofquery*source:wikipediaRelationalmadenormalizeddatalooklikethisDocumentdatabasesmakenormalizeddatalooklikethisSometermsbeforeweproceedRDBMSDocument DBsTableCollectionView/Row(s)JSONDocumentIndexIndexJoinEmbedding&LinkingacrossdocumentsPartitionShardPartitionKeyShardKeyRecapDesigndocumentsthatsimplymaptoyourapplicationpost=author:“roger”,date:new Date(),text:“I love J.Biebs.”,tags:“rockstar”,“puppy-love”QueryoperatorsConditionaloperators:$ne,$in,$nin,$mod,$all,$size,$exists,$type,.$lt,$lte,$gt,$gte,$ne,/findpostswithanytagsdb.posts.find(tags:$exists:true)QueryoperatorsConditionaloperators:$ne,$in,$nin,$mod,$all,$size,$exists,$type,.$lt,$lte,$gt,$gte,$ne,/findpostswithanytagsdb.posts.find(tags:$exists:true)Regularexpressions:/postswhereauthorstartswithkdb.posts.find(author:/r*/i)QueryoperatorsConditionaloperators:$ne,$in,$nin,$mod,$all,$size,$exists,$type,.$lt,$lte,$gt,$gte,$ne,/findpostswithanytagsdb.posts.find(tags:$exists:true)Regularexpressions:/postswhereauthorstartswithkdb.posts.find(author:/r*/i)Counting:/postswrittenbymike db.posts.find(author:“roger”).count()ExtendingtheSchemanew_comment=author:“Gretchen”,date:newDate(),text:“BiebsisToll!”new_info=$push:comments:new_comment,$inc:comments_count:1 db.posts.update(_id:“.”,new_info)_id:ObjectId(4c4ba5c0672c685e5e8aabf3),author:”roger,date:SatJul24201019:47:11GMT-0700(PDT),text:I love J.Biebs.,tags:”rockstar,”puppy-love,comments_count:1,comments:author:”Gretchen,date:SatJul24201020:51:03GMT-0700(PDT),text:”BiebsisToll!ExtendingtheSchema/createindexonnesteddocuments:db.posts.ensureIndex(comments.author:1)db.posts.find(comments.author:”Gretchen”)/findlast5posts:db.posts.find().sort(date:-1).limit(5)/mostcommentedpost:db.posts.find().sort(comments_count:-1).limit(1)Whensorting,checkifyouneedanindexExtendingtheSchemaSingleTableInheritancedb.shapes.find()_id:ObjectId(.),type:circle,area:3.14,radius:1_id:ObjectId(.),type:square,area:4,d:2_id:ObjectId(.),type:rect,area:10,length:5,width:2/findshapeswhereradius0db.shapes.find(radius:$gt:0)/createindexdb.shapes.ensureIndex(radius:1)OnetoMany-EmbeddedArray/UsingArrayKeys-sliceoperatortoreturnsubsetofarray-hardtofindlatestcommentsacrossalldocumentsOnetoMany-EmbeddedArray/ArrayKeys-sliceoperatortoreturnsubsetofarray-hardtofindlatestcommentsacrossalldocuments-Embeddedtree-Singledocument-NaturalOnetoMany-EmbeddedArray/ArrayKeys-sliceoperatortoreturnsubsetofarray-hardtofindlatestcommentsacrossalldocuments-Embeddedtree-Singledocument-Natural-Normalized(2collections)-mostflexible-morequeriesMany-ManyExample:-Productcanbeinmanycategories-CategorycanhavemanyproductsProducts-product_idCategory-category_idProd_Categories-id-product_id-category_idproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”ManyManyproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”categories:_id:ObjectId(4c4ca25433fb5941681b912f),name:Indonesia,product_ids:ObjectId(4c4ca23933fb5941681b912e),ObjectId(4c4ca30433fb5941681b9130),ObjectId(4c4ca30433fb5941681b913aManyManyproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”categories:_id:ObjectId(4c4ca25433fb5941681b912f),name:Indonesia,product_ids:ObjectId(4c4ca23933fb5941681b912e),ObjectId(4c4ca30433fb5941681b9130),ObjectId(4c4ca30433fb5941681b913a/Allcategoriesforagivenproductdb.categories.find(product_ids:ObjectId(4c4ca23933fb5941681b912e)Many-Manyproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”categories:_id:ObjectId(4c4ca25433fb5941681b912f),name:Indonesia,product_ids:ObjectId(4c4ca23933fb5941681b912e),ObjectId(4c4ca30433fb5941681b9130),ObjectId(4c4ca30433fb5941681b913a/Allcategoriesforagivenproductdb.categories.find(product_ids:ObjectId(4c4ca23933fb5941681b912e)/Allproductsforagivencategorydb.products.find(category_ids:ObjectId(4c4ca25433fb5941681b912f)Many-Manyproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”categories:_id:ObjectId(4c4ca25433fb5941681b912f),name:IndonesiaAlternativeproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”categories:_id:ObjectId(4c4ca25433fb5941681b912f),name:Indonesia/Allproductsforagivencategorydb.products.find(category_ids:ObjectId(4c4ca25433fb5941681b912f)Alternativeproducts:_id:ObjectId(4c4ca23933fb5941681b912e),name:SumatraDarkRoast,category_ids:ObjectId(4c4ca25433fb5941681b912f),ObjectId(4c4ca25433fb5941681b92af”categories:_id:ObjectId(4c4ca25433fb5941681b912f),name:Indonesia/Allproductsforagivencategorydb.products.find(category_ids:ObjectId(4c4ca25433fb5941681b912f)/Allcategoriesforagivenproductproduct=db.products.find(_id:some_id)db.categories.find(_id:$in:product.category_ids)AlternativeTreesFullTreeinDocumentcomments:author:“rpb”,text:“.”,replies:author:“Fred”,text:“.”,replies:Pros:SingleDocument,Performance,IntuitiveCons:Hardtosearch,4MBlimitTrees-continuedParentLinks-Eachnodeisstoredasadocument-ContainstheidoftheparentChildLinks-Eachnodecontainstheidsofthechildren-Cansupportgraphs(multipleparents/child)ArrayofAncestors-StoreAncestorsofanode_id:a_id:b,ancestors:a,parent:a_id:c,ancestors:a,b,parent:b_id:d,ancestors:a,b,parent:b_id:e,ancestors:a,parent:a_id:f,ancestors:a,e,parent:e_id:g,ancestors:a,b,d,parent:dArrayofAncestors-StoreAncestorsofanode_id:a_id:b,ancestors:a,parent:a_id:c,ancestors:a,b,parent:b_id:d,ancestors:a,b,parent:b_id:e,ancestors:a,parent:a_id:f,ancestors:a,e,parent:e_id:g,ancestors:a,b,d,parent:d/findalldescendantsofb:db.tree2.find(ancestors:b)ArrayofAncestors-StoreAncestorsofanode_id:a_id:b,ancestors:a,parent:a_id:c,ancestors:a,b,parent:b_id:d,ancestors:a,b,parent:b_id:e,ancestors:a,parent:a_id:f,ancestors:a,e,parent:e_id:g,ancestors:a,b,d,parent:d/findalldescendantsofb:db.tree2.find(ancestors:b)/findallancestorsoff:ancestors=db.tree2.findOne(_id:f).ancestorsdb.tree2.find(_id:$in:ancestors)VariableKeysHowtoindex?_id:uuid1,field1:ctx1:ctx3:5,ctx8:ctx3:5,db.MyCollection.find(field1.ctx1.ctx3:$exists:true)Rewrite:_id:uuid1,field1:key:ctx1”,value:k:ctx3”,v:5,key:ctx8”,value:k:ctx3”,v:5,db.x.ensureIndex(“field1.key.k”,1)findAndModifyQueueexample/Example:findhighestpriorityjobandmarkjob=db.jobs.findAndModify(query:inprogress:false,sort:priority:-1),update:$set:inprogress:true,started:newDate(),new:true)LearnMoreKylespresentation+video:http:/ let us know what you thinkmongodbDBRefDBRef$ref:collection,$id:id_value-ThinkURL-YDSMV:yourdriversupportmayvarySampleSchema:nr=note_refs:$ref:notes,$id:5,.Dereferencing:nr.forEach(function(r)printjson(dbr.$ref.findOne(_id:r.$id);BSONMongodbstoresdatainBSONinternallyLightweight,Traversable,EfficientencodingTypedboolean,integer,float,date,string,binary,array.