像这篇文章( https://www.codenong.com/13466954/)这样存储属性数量可变的 Java 对象,数据量大的时候 sql 语句怎么优化,或者有什么其他存储属性变量可变的数据存储检索方案吗
1
zhchyu999 2023-01-15 22:42:42 +08:00
mongodb ? es ?
|
2
h0099 2023-01-15 22:48:41 +08:00
https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model
典型例子是 wordpress 中臭名昭著的 wp_postmeta 表 https://codex.wordpress.org/Database_Description 但 EVA 性能也不如文档数据库(如 mongo )好,除非按 meta_key 分 partition 甚至分表 |
3
h0099 2023-01-15 22:50:03 +08:00
typo:EVA=>EAV
wp 中 postmeta 的用途: https://codex.wordpress.org/Post_Meta_Data_Section https://developer.wordpress.org/reference/functions/get_post_meta/ |
4
James0 2023-01-16 02:21:44 +08:00
为什么要用关系型,直接上 mongo 不行吗
|
5
h0099 2023-01-16 07:33:17 +08:00
> 像这篇文章( https://www.codenong.com/13466954/)
有没有可能,这是又一个 stackexchange 机翻垃圾站: https://stackoverflow.com/questions/13466954/how-to-store-a-java-object-with-variable-number-of-attributes #4 @James0 换不换别的数据库主要看他愿不愿意,毕竟有学习迁移成本,比如得扔掉 sql 重新学习 mongo query lang (当然如果他本就不会手写 sql 一直都是靠 orm 抽象隔离那也没多少区别) |
6
wangxiaoaer 2023-01-16 08:47:23 +08:00
@James0 #4 如果系统里面 90 个实体都是常规关系型,剩下 10 个才是这种变化类的实体,全部换 mongo 也并不科学。
这种我觉得有几种办法: 1 机翻文提到那种方案,类 wordpress ,缺点是数据量上来后会爆炸。 2 引入 ES ,把变化的属性信息塞进去,其他还放到 sql 中,然后查询层面做控制。 3 变化信息通过 JSON 存储,选择支持 JSON 的关系型数据库,比如 PG 。 |
7
h0099 2023-01-16 09:14:39 +08:00
2. es 不也得重新学习他自己的查询语言而不是直接用基于的 sql orm
3. mysql8 早就支持 json 列并对字段做索引了,当然如果 OP 所要存储的 json 的 root 层是字面量和 object/array 混合的 如 ``` 0 false NaN {a:1} [{a:1},undefined,{b,2}] null ``` (以上都是合法 json ) 那就极难索引 |
8
h0099 2023-01-16 09:17:57 +08:00
1. 用 EAV 模型如果能把 meta_key (也就是 OP 要的动态字段名)给约束到已知范围从而改成 ENUM (本质 int )类型(但这就不动态)
或是约束到定长 varchar (仍然动态) 那就可以加索引 但这索引的基数( index cardinality )会特别大导致查询计划优化器可能放弃使用他,对此可以添加 id 自然键构成 composite key ,如(post_id, meta_key) |
9
thetbw 2023-01-16 09:43:54 +08:00
单独整个 kv 的属性表可行不,主表只包含关键字段。其他都以 kv 形式存在另一张表
|
11
enjoychen0318 2023-01-16 11:18:22 +08:00
|
12
shade OP 如果后期为了方便对商品进行协同过滤推荐,评分的指标个数不确定,评分矩阵如何存到数据库比较合适?
|
13
Andy223 2023-01-17 01:08:29 +08:00
直接存 json 再搞个 inverted index 或者引入 es 不就完了?
|
14
h0099 2023-01-17 03:33:22 +08:00 1
|
15
kenvix 2023-01-17 11:18:35 +08:00 1
假定你一定要用关系型,并且排除关系型 KV 这种性能不高的做法...啥,矩阵?为什么不能用 postgres 的 array ?直接 flatten 后当 array 存不就行了?
|
16
kenvix 2023-01-17 11:21:42 +08:00
再添加两个字段记录矩阵的 shape ,用的时候取回 array 再 reshape 就行了
|