数据模型介绍
数据建模挑战的是应用需求的平衡,数据库引擎的性能特性以及数据的检索模式。
在设计数据模型时,始终考虑数据的使用情况(例如:数据查询,更新和处理)和数据本身的固有结构.
灵活模式
不同于SQL数据库的写入数据前必须决定和声明一份表格结构,文档型数据库的集合在默认情况下不需要集合中的文档具有相同的结构.也就是说:
- 在单个集合中的文档不需要有相同的字段集且字段的数据类型可以在集合中的不同文档之间有所不同.
- 要更改一个集合中文档的结构,例如:添加新字段,删除现有字段或者改变字段的值数据类型,可以更新文档至新的结构.
这种灵活帮助把文档映射成为一个实体或对象.每一个文档可以匹配所表示实体的数据字段,即使该文档和集合中的其他文档有很大的不同.
在现实中,集合中的文档会具有相同的结构,我们可以在对集合进行更新和插入数据的操作时强制文档的有效性规则.
文档结构
为文档型数据库设计数据模型的关键是文档结构和应用程序如何呈现数据间的关系.
文档型数据库允许相关的数据嵌入到单个文档中.
嵌入式数据
嵌入式文档通过在单个文档结构中存储相关的数据来捕获数据间的关系.
文档型数据库允许在文档的字段或数组中嵌入文档结构.这些非结构化的数据模型允许应用程序在单次数据库操作中检索和操作相关数据.
{
_id: <ObjectId1>,
username: "123xyz",
//嵌入的子文档
contact: {
phone: "123-456-7890",
email: "xyz@example.com"
},
//嵌入的子文档
access: {
level: 5,
group: "dev"
}
}
在许多文档型数据库使用案例中,非结构化的数据模型是最佳的.
嵌入式数据模式应用场景:
- 实体间存在包含关系的
- 实体间存在1对多关系的
引用
引用通过文档间的链接或引用来存储数据间的关系.
应用程序可以通过解释这些引用来访问数据,这些通常是结构化数据模式.
//user document
{
_id: <ObjectId1>,
username: "123xyz"
}
//contact document
{
_id: <ObjectId2>,
user_id: <ObjectId1>,
phone: "123-456-7890",
email: "xyz@example.com"
}
//access document
{
_id: <ObjectId3>,
user_id: <ObjectId1>,
level: 5,
group: "dev"
}
写操作的原子性
单个文档的原子性
在文档型数据库中,写操作是在单个文档级别上的原子操作,即使是操作修改了单个文档中的多个嵌入文档.
具有嵌入数据的非规范化数据模型将所有相关数据组合在一个文档中,而不是在多个文档和集合中进行规范化。 该数据模型有助于原子操作。
一次写入操作(例如db.collection.updateMany())修改多个文档时,每个文档的修改都是原子的,但整个操作不是原子的。
当执行多文档写操作时,无论是通过单次写操作还是通过多次写操作,其他操作可以交差进行。
网友评论