抽丝剥茧探穷境!一次数据库JSON字段的深度使用实践
背景
在我们系统中,承接多种行业,多种商家的,多个业务条线,不同场景的的不同业务诉求,在实现上将个性和通用字段隔离,通用字段是所有条线通用逻辑所共用的标准字段,对于个别条线的个性化诉求,则通过个性化扩展字段来实现。
通用字段,作用于通用逻辑,所有条线走到相应功能时,会对通用字段读写。而对于个性扩展字段而言,只有用到个性化功能时,才会对个性化扩展字段进行赋值。在数据库持久化存储上,用不到该个性化扩展字段时,该字段无需存储,不占用额外存储空间。

在表结构上,使用JSON类型字段进行存储。在日常扩展字段的开发过程中,不可避免的用到JSON函数进行字段处理。
常用JSON函数一览
| Description | |
-> |
Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT(). |
->> |
Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). |
JSON_APPEND() |
Append data to JSON document |
JSON_ARRAY() |
Create JSON array |
JSON_ARRAY_APPEND() |
Append data to JSON document |
JSON_ARRAY_INSERT() |
Insert into JSON array |
JSON_CONTAINS() |
Whether JSON document contains specific object at path |
JSON_CONTAINS_PATH() |
Whether JSON document contains any data at path |
JSON_DEPTH() |
Maximum depth of JSON document |
JSON_EXTRACT() |
Return data from JSON document |
JSON_INSERT() |
Insert data into JSON document |
JSON_KEYS() |
Array of keys from JSON document |
JSON_LENGTH() |
Number of elements in JSON document |
JSON_MERGE() |
Merge JSON documents, preserving duplicate keys. Deprecated synonym for JSON_MERGE_PRESERVE() |
JSON_MERGE_PATCH() |
Merge JSON documents, replacing values of duplicate keys |
JSON_MERGE_PRESERVE() |
Merge JSON documents, preserving duplicate keys |
JSON_OBJECT() |
Create JSON object |
JSON_PRETTY() |
Print a JSON document in human-readable format |
JSON_QUOTE() |
Quote JSON document |
JSON_REMOVE() |
Remove data from JSON document |
JSON_REPLACE() |
Replace values in JSON document |
JSON_SEARCH() |
Path to value within JSON document |
JSON_SET() |
Insert data into JSON document |
JSON_STORAGE_SIZE() |
Space used for storage of binary representation of a JSON document |
JSON_TYPE() |
Type of JSON value |
JSON_UNQUOTE() |
Unquote JSON value |
JSON_VALID() |
Whether JSON value is valid |
JSON字段实现项目场景诉求典型案例分析
JSON字段对我们系统来说并不陌生,有不少场景使用,下面有一些典型的使用场景案例先放出来作为JSON字段项目使用背景铺垫一下。
扩展字段的存储和查询
动态扩展查询案例
在二手库或逆向条件,有比较多的扩展属性,其他条线缺没有这些属性值,这些属性以JSON扩展的方式存储。
下面是一个JSON扩展字段的JSON数据示例:
{
"ppCode": "PPDA4302865239B10F",
"zoneNo": "STAGE-OUTBOUND",
"zoneName": "出库暂存区",
"zoneType": "t",
"extendMap": {
"cid1": 13765,
"cid2": 14192,
"cid3": 14533,
"deptId": "1",
"jdFlag": 1,
"symbol": 300,
"brandId": 52368,
"cbjPrice": 2034,
"salesPin": "xumingchen",
"commonType": 0,
"wareSource": 100,
"orderSource": "it100",
"supplierCode": "lgde",
"outTransferId": "1284009718",
"inboundSourceType": 100,
"purchaseChannelId": "1001"
},
"storeCode": "",
"sourceModule": "wms-pick",
"isolationZone": false,
"stageZoneType":