在我的例子中,我有一个名为 clients 的表,它遵循以下信息:
store_listing:
#######
id SERIAL PK
title VARCHAR(100) not null
features JSONB not null
comments TEXT
vat_num VARCHAR(100) NOT null
我用来生成的这张表:
- 客户端列表(例如各种第 3 方服务的 csv 生成)
- 将横幅更改为网站以进行各种促销
- 启用和禁用客户端有权访问的各种功能。
一个典型的值可以是:
{
banner_cats:{
active: true,
types: ['persian','aegean']
},
promo_petfest_2023:{
active: true,
meta: ['dogs','cats','giraqffes']
},
1bank_catzoo: {
active: true
},
feature_virtual_pet: {
active: true
}
}
每次我需要标记元数据并将其放置到特定的 Store_listing 时,我都需要更新该features
列。此外,在我的案例中,促销可以根据例如一个大型组织(例如 WWE)想要制作一个将在我的网站上放置特殊横幅的促销,因此我必须像这样更新集成列:
{
banner_cats:{
active: true,
types: ['persian','aegean']
},
promo_petfest_2023:{
active: true,
meta: ['dogs','cats','giraqffes']
},
1bank_catzoo: {
active: true
},
feature_virtual_pet: {
active: true
},
wwe_wild_beast_payperview:{
active: true
}
}
这对我来说似乎是一个错误的决定,因此我认为这种方法:
features_and_promos_settings
####
listing_id FK store_listing
identifier: String (lowercase, does not contain spaces)
active: boolean
meta: jsonb
type: ENUM(PROMO,FEATURE,BANNER) NULL
#####
PK (listing_id, identifier)
所以在我的例子中,该integrations
列将包含这个值 (listing_id = 1) :
{
banner_cats:{
active: true,
types: ['persian','aegean']
},
promo_petfest_2023:{
active: true,
meta: ['dogs','cats','giraqffes']
},
1bank_catzoo: {
active: true
},
feature_virtual_pet: {
active: true
},
wwe_wild_beast_payperview:{
active: true
}
}
会变成记录features_and_promos_settings
listing_id | 标识符 | 积极的 | 元 | 类型 |
---|---|---|---|---|
1个 | 旗帜猫 | 真的 | {类型:['波斯','爱琴海']} | 横幅 |
1个 | promo_petfest_2023 | 真的 | {meta: ['dogs','cats','giraqffes']} | 促销 |
1个 | 1bank_catzoo | 真的 | 无效的 | 无效的 |
1个 | feature_virtual_pet | 真的 | 无效的 | 特征 |
1个 | wwe_wild_beast_payperview | 真的 | 无效的 | 横幅 |
但是这种方法在选择过程中的搜索和资源使用等情况下对我有好处吗?我将使用的 RDMS 是 postgresql-11。
我预计可能会为 KPIS 生成报告(例如回答问题有多少列表参与了特定的促销活动)
我会说将 JSON 数组拆分为表中的一组行当然是个好主意。您的更新会变得更快,而您的查询不会变慢。