mvc做网站用的多不多网络销售入门基本知识
2026/5/13 23:38:29 网站建设 项目流程
mvc做网站用的多不多,网络销售入门基本知识,网站加关键词,郑州做网站哪里便宜文章目录一、JSONB概述1.1 JSONB的应用场景及功能1.2 JSON vs JSONB#xff1a;本质区别1.3 如何合理设置JSONB类型#xff1f;1.4 JSONB的使用建议1.5 JSONB 未来可能的演进二、JSONB 基础操作2.1 创建包含 JSONB 的表2.2 插入 JSONB 数据2.3 基本查询2.4 JSONB 更新与修改三…文章目录一、JSONB概述1.1 JSONB的应用场景及功能1.2 JSON vs JSONB本质区别1.3 如何合理设置JSONB类型1.4 JSONB的使用建议1.5 JSONB 未来可能的演进二、JSONB 基础操作2.1 创建包含 JSONB 的表2.2 插入 JSONB 数据2.3 基本查询2.4 JSONB 更新与修改三、JSONB 高级查询3.1 包含与存在判断3.2 路径查询# 与 #四、JSONB 函数大全4.1 结构分析函数4.2 构造与转换函数五、JSONB 索引优化性能的关键5.1 GIN 索引最常用5.2 表达式索引针对特定路径5.3 多列复合索引5.4 索引选择建议六、典型应用场景6.1 灵活的用户配置表6.2 API 请求/响应日志6.3 电商商品动态属性6.4 事件溯源Event Sourcing七、常见问题与解决方案7.1 NULL 与 missing key 的区别7.2 数字 vs 字符串比较7.3 更新操作的原子性本文将从基础概念到高级实战系统性地讲解 PostgreSQL 中JSONB的核心原理、操作语法、性能优化、索引策略及典型应用场景旨在帮助开发者和 DBA 充分释放 JSONB 的潜力。一、JSONB概述1.1 JSONB的应用场景及功能PostgreSQL 自 9.2 版本引入对 JSON 的原生支持并在 9.4 版本中重磅推出JSONBJSON Binary数据类型彻底改变了传统关系型数据库处理半结构化数据的方式。如今JSONB 已成为 PostgreSQL 最具竞争力的特性之一广泛应用于配置管理、日志存储、API 数据缓存、灵活表结构设计等场景。与传统的JSON类型不同JSONB以二进制格式存储数据支持索引、高效的查询和更新操作同时保留了完整的 JSON 语义。它既具备 NoSQL 的灵活性又继承了关系型数据库的 ACID 事务、强一致性、丰富索引和 SQL 表达能力——这正是“多模型数据库”Multi-model Database理念的完美体现。1.2 JSON vs JSONB本质区别1、存储格式JSON以文本形式存储保留原始输入的格式包括空格、键顺序、重复键等。每次读取都需要解析。JSONB以二进制格式decomposed binary format存储自动去除无意义空格、标准化键顺序、丢弃重复键仅保留最后一个读取时无需解析速度更快。推荐除非需要严格保留原始 JSON 字符串如审计日志否则一律使用JSONB。2、功能对比特性JSONJSONB存储效率低文本高二进制查询性能慢需解析快直接访问支持索引❌✅GIN, BTREE 等支持更新操作❌✅jsonb_set, 保留键顺序✅❌按字母排序保留重复键✅❌自动去重示例SELECT{b:2, a:1}::json;-- 输出: {b:2, a:1}SELECT{b:2, a:1}::jsonb;-- 输出: {a: 1, b: 2}1.3 如何合理设置JSONB类型1、不要滥用 JSONB适合结构多变、读多写少、非核心业务字段。不适合频繁 JOIN、强约束、高并发更新的字段。原则核心实体用关系模型扩展属性用 JSONB。2、控制 JSONB 大小单个 JSONB 字段最大 1GB受 TOAST 限制但建议 1MB过大的 JSONB 会影响 WAL 日志、复制和备份效率。3、避免深度嵌套查询深层路径如a.b.c.d.e难以索引建议扁平化结构或拆分为多个 JSONB 字段。4、使用生成列Generated ColumnsPostgreSQL 12 支持基于 JSONB 的生成列可对其建立普通索引ALTERTABLEproductsADDCOLUMNbrandTEXTGENERATED ALWAYSAS(attributes-brand)STORED;CREATEINDEXONproducts(brand);优点查询WHERE brand Dell性能接近普通列且自动同步。1.4 JSONB的使用建议JSONB 是 PostgreSQL 融合关系模型与文档模型的杰出成果。它不是要取代传统表结构而是为那些“结构不确定、变化频繁、查询模式多样”的数据提供了一种优雅的解决方案。掌握 JSONB意味着你能在同一个数据库中同时享受 SQL 的强大表达力与 NoSQL 的灵活性。正如 PostgreSQL 官方所言“You don’t have to choose between relational and document — you can have both.”建议小规模项目大胆使用 JSONB 快速迭代大规模系统结合生成列、合理索引、监控执行计划永远记住好的数据模型 关系 文档 合理边界。1.5 JSONB 未来可能的演进JSON Schema 验证社区正在推动内置 JSON Schema 支持目前需通过触发器或外部函数实现。向量化执行未来版本可能优化 JSONB 的批量处理性能。与 GraphQL 集成借助graphql-postgres等工具JSONB 可作为 GraphQL 后端的数据源。二、JSONB 基础操作2.1 创建包含 JSONB 的表CREATETABLEproducts(idSERIALPRIMARYKEY,nameTEXTNOTNULL,attributes JSONB);2.2 插入 JSONB 数据INSERTINTOproducts(name,attributes)VALUES(Laptop,{brand: Dell, cpu: i7, ram_gb: 16, tags: [gaming, work]}::jsonb),(Phone,{brand: Apple, model: iPhone 15, color: black, in_stock: true}::jsonb);注意可省略::jsonbPostgreSQL 会自动推断但显式转换更安全。2.3 基本查询1、查询整个 JSONB 字段SELECTname,attributesFROMproducts;2、使用-和-提取值column-key返回JSONB类型可用于嵌套查询column-key返回TEXT类型适合显示或比较-- 获取品牌JSONB 类型SELECTattributes-brandFROMproducts;-- 获取品牌TEXT 类型SELECTattributes-brandASbrandFROMproducts;-- 结果: Dell, Apple3、访问数组元素-- 获取 tags 数组的第一个元素JSONBSELECTattributes-tags-0FROMproductsWHEREattributes-brandDell;-- 结果: gaming-- 转为 TEXTSELECTattributes-tags-0FROMproducts;4、嵌套对象访问-- 假设 attributes {specs: {screen: 15inch, weight_kg: 2.1}}SELECTattributes-specs-screenFROMproducts;2.4 JSONB 更新与修改JSONB 支持多种方式更新字段这是其超越传统 JSON 的关键优势。1、使用||合并-- 为某产品添加新属性UPDATEproductsSETattributesattributes||{warranty_years: 3}::jsonbWHEREnameLaptop;注意若键已存在||会覆盖原值。2、使用jsonb_set精准更新语法jsonb_set(target_jsonb,path_array,new_value,create_missing)create_missing若路径不存在是否创建默认true示例-- 修改 CPU 型号UPDATEproductsSETattributesjsonb_set(attributes,{cpu},i9,false)WHEREattributes-brandDell;-- 为无 discount 字段的产品添加默认值UPDATEproductsSETattributesjsonb_set(attributes,{discount},0.1,true)WHERENOT(attributes ?discount);3、删除键或数组元素删除键使用-操作符UPDATEproductsSETattributesattributes-in_stock;删除数组元素需指定索引不常用因数组顺序可能变化-- 删除 tags[1]UPDATEproductsSETattributesjsonb_set(attributes,{tags},(attributes-tags)-1);更安全的做法是重构为对象或使用应用层处理。三、JSONB 高级查询PostgreSQL 提供了丰富的操作符用于复杂查询。3.1 包含与存在判断操作符含义示例左侧包含右侧attributes {brand: Dell}左侧被右侧包含较少用?键是否存在attributes ? in_stock?是否存在任一键数组?是否包含所有键attributes ? ARRAY[brand, cpu]示例-- 查找所有有 gaming 标签的产品SELECT*FROMproductsWHEREattributes-tags?gaming;-- 查找包含指定属性组合的产品SELECT*FROMproductsWHEREattributes {brand: Apple, color: black};3.2 路径查询#与#用于通过路径数组访问深层嵌套值-- 假设 attributes {user: {profile: {age: 30}}}SELECTattributes#{user,profile,age} FROM logs;-- 返回 JSONB: 30SELECTattributes#{user,profile,age} FROM logs;-- 返回 TEXT: 30路径必须是文本数组不能动态拼接但可在函数中构造。四、JSONB 函数大全PostgreSQL 提供大量内置函数处理 JSONB。4.1 结构分析函数函数作用jsonb_each(jsonb)将顶层键值对展开为行key TEXT, value JSONBjsonb_each_text(jsonb)同上value 为 TEXTjsonb_object_keys(jsonb)返回顶层所有键TEXT 集合jsonb_array_elements(jsonb)展开 JSON 数组为行jsonb_array_length(jsonb)返回数组长度jsonb_typeof(jsonb)返回值类型“string”, “number”, “boolean”, “object”, “array”, “null”示例展开 tags 数组SELECTname,tagFROMproducts,jsonb_array_elements_text(attributes-tags)AStag;-- 结果-- Laptop | gaming-- Laptop | work4.2 构造与转换函数函数作用jsonb_build_object(key1, val1, ...)构造 JSONB 对象jsonb_build_array(val1, val2, ...)构造 JSONB 数组row_to_json(row)/to_jsonb(row)将行转为 JSONjsonb_strip_nulls(jsonb)移除值为 null 的键示例动态构建配置SELECTjsonb_build_object(user_id,id,preferences,jsonb_build_object(theme,dark,lang,en))ASconfigFROMusersLIMIT1;-- 结果: {user_id: 1, preferences: {theme: dark, lang: en}}五、JSONB 索引优化性能的关键未加索引的 JSONB 查询在大数据量下会非常慢。PostgreSQL 提供多种索引策略。5.1 GIN 索引最常用适用于,?,?|,?等操作。-- 对整个 JSONB 字段建 GIN 索引CREATEINDEXidx_products_attributesONproductsUSINGGIN(attributes);-- 查询将走索引SELECT*FROMproductsWHEREattributes {brand: Dell};5.2 表达式索引针对特定路径若只查询某个键可创建表达式索引提升效率-- 为 attributes-brand 创建 BTREE 索引适合 , , 比较CREATEINDEXidx_products_brandONproducts((attributes-brand));-- 或 GIN 索引适合存在性检查CREATEINDEXidx_products_tagsONproductsUSINGGIN((attributes-tags));注意attributes-tags是 JSONB 类型可用 GINattributes-brand是 TEXT用 BTREE。5.3 多列复合索引-- 品牌 是否在库存CREATEINDEXidx_products_brand_instockONproducts((attributes-brand),(attributes-in_stock));5.4 索引选择建议查询模式推荐索引WHERE attr {k: v}GIN(attr)WHERE attr-k vBTREE((attr-k))WHERE attr-arr ? xGIN((attr-arr))多条件组合复合表达式索引 使用EXPLAIN ANALYZE验证索引是否生效。六、典型应用场景6.1 灵活的用户配置表传统方案需为每个配置项建列扩展困难。使用 JSONBCREATETABLEuser_settings(user_idINTPRIMARYKEY,prefs JSONBDEFAULT{});-- 设置偏好UPDATEuser_settingsSETprefsprefs||{theme: dark, notifications: true};-- 查询深色主题用户SELECTuser_idFROMuser_settingsWHEREprefs-themedark;6.2 API 请求/响应日志记录原始请求体便于调试和重放CREATETABLEapi_logs(id BIGSERIAL,endpointTEXT,request JSONB,response JSONB,created_at TIMESTAMPTZDEFAULTNOW());-- 查询某用户的所有请求SELECT*FROMapi_logsWHERErequest {user_id: 123};6.3 电商商品动态属性不同品类商品属性差异大手机 vs 衣服INSERTINTOproducts(name,category,specs)VALUES(T-Shirt,clothing,{size: M, color: red, material: cotton}),(Smartphone,electronics,{screen_size: 6.1, battery_mah: 3500});前端可根据category动态渲染表单。6.4 事件溯源Event Sourcing存储事件负载CREATETABLEevents(id UUIDPRIMARYKEY,event_typeTEXT,payload JSONB,occurred_at TIMESTAMPTZ);-- 查询用户注册事件SELECTpayload-emailFROMeventsWHEREevent_typeuser_registeredANDpayload {source: web};七、常见问题与解决方案7.1 NULL 与 missing key 的区别attributes-nonexist返回NULLJSONB 类型attributes-nonexist返回NULLTEXT 类型问题无法区分“键不存在”和“键值为 null”。解决方案使用jsonb_typeof或检查键是否存在SELECTattributes ?optional_fieldASkey_exists,attributes-optional_fieldASvalueFROMproducts;7.2 数字 vs 字符串比较-- 错误JSONB 中数字 100 与字符串 100 不等SELECT{price: 100}::jsonb {price: 100}::jsonb;-- false-- 正确确保类型一致SELECT{price: 100}::jsonb {price: 100}::jsonb;-- true应用层应保证数据类型一致性。7.3 更新操作的原子性jsonb_set和||是原子操作但复杂逻辑需在事务中完成BEGIN;-- 先读SELECTattributesFROMproductsWHEREid1FORUPDATE;-- 应用层修改-- 再写UPDATEproductsSETattributes...WHEREid1;COMMIT;或使用WITH子句在 SQL 内完成WITHupdatedAS(SELECTid,jsonb_set(attributes,{counter},to_jsonb((attributes-counter)::int1))ASnew_attrFROMproductsWHEREid1)UPDATEproductsSETattributesupdated.new_attrFROMupdatedWHEREproducts.idupdated.id;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询