关系型数据库的范式化设计和ES的反范式化设计

文章探讨了关系型数据库的范式化设计,包括1NF到BCNF,以及范式化带来的查询效率和更新简化的问题。同时,介绍了ES的反范式化设计,强调其数据读取性能的优势和数据频繁变动的不足。文中提到了ES处理关联关系的两种方式:嵌套对象和父子关系,解析了它们在解决数据关联问题上的特点。
摘要由CSDN通过智能技术生成

关系型数据库的范式化设计

范式化设计的主要目标是:减少不必要的更新

  • 1NF:消除非主属性对键的部分函数依赖,不重复的列(关系型数据库的基本要求)
  • 2NF:消除非主属性对键的传递函数依赖,非主属性完全依赖于主关键字
  • 3NF:消除主属性对键的传递函数依赖,属性不依赖于其他非主属性
  • BCNF:主属性不依赖主属性,3NF的基础上,数据库表中如果不存在任何字段对任一候选关键字字段的传递函数依赖则符合BCNF

范式化的问题

  • 数据库范式化,就需要join越多的表,导致查询缓慢
  • 规范化节省了存储空间,但是存储空间越来越便宜
  • 范式化简化了更新,但是读操作可能更复杂、耗时

反范式化设计

  • 不使用关联关系,而是文档中保存冗余的数据拷贝
  • 优点:无需Joins操作,数据读取性能好
  • 缺点:不适合在数据频繁改动的场景

关于ES

ES不擅长处理关联关系,优先采用反范式化设计。ES处理关联关系的方法:

  • 对象类型
  • 嵌套对象
  • 父子关联关系
  • 应用端关联
Nested Object Parent/Child
优点 文档存储在一起,读取性能高 父子文档可独立更新
缺点 更新嵌套的子文档时,需要更新整个文档 需要额外的内存维护关系。读取性能相对差
适用场景 子文档偶尔更新,以查询为主 子文档更新频繁
嵌套对象 (Nested Object)

对于没有使用嵌套对象的数组类型,数据会被扁平化处理,是无法区分数据是来自哪个Item(如Demo中的 first name, last name)。Nested Object 数组,是独立的多个对象,不存在被扁平化处理的问题,所以可以正常的区分Item(如Demo中的 first name, last name)

DELETE my_movies

# 电影的Mapping信息
PUT my_movies
{
      "mappings" : {
      "properties" : {
        "actors" : {
          "properties" : {
            "first_name" : {
              "type" : "keyword"
            },
            "last_name" : {
              "type"
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值