所有字段支持排序,有 v 友有好的解决方案吗

2020-06-19 10:23:11 +08:00
 tuine

有个需求正在做,所有字段支持排序,而且字段是可增加的,数据库用的 pgsql,目前想的是同步到 ES,然后进行排序......

1925 次点击
所在节点    程序员
9 条回复
guyeu
2020-06-19 11:35:08 +08:00
当你觉得一个东西的设计很傻逼,说明要不然需求有问题,要不然对需求的理解有问题。。。
Liutos
2020-06-19 13:38:06 +08:00
砍需求
reus
2020-06-19 13:46:25 +08:00
要排序就加索引啊,有什么问题?
表结构 key, value 就行了
索引这样建:create index on xxx using btree((value)) where key = 'foo'
加一个字段就建一个索引,反正你的字段也不会无限多吧?
需求不傻逼,需求也不用砍,因为你用的是 pg,pg 支持 partial index
tuine
2020-06-19 14:37:11 +08:00
@guyeu
@Liutos
需求确实很傻逼,老板说给我一个充分的理由,不然就需要这个!
tuine
2020-06-19 14:44:27 +08:00
@reus
加索引也考虑过,但是感觉不太合理,而且会造成大量索引数据
crclz
2020-06-19 14:50:32 +08:00
(某张表)所有字段支持排序,而且字段是可增加的

方案 1:
例如,这张表为( id,姓名,班级,电话号码)
那么,我们需要建立下表来进行存储:
( id,key,value )
某列( id=1,姓名=zhangsan,班级=12,电话=18988888888 )可以转换为下表:
( 1,姓名,zhangsan )( 1,班级,12 )( 1,电话号码,18988888888 )

评价:方案 1 开发简单,容易想到。但是将连接好的列拆分会面临以下问题:
1. 无法创建包含多列的索引(当然,如果你只需要单一的按照某个列排序,则不存在这个问题)
2. JOIN 开销大

但是,当数据量、并发量小的时候,1 和 2 都不称之为问题。


方案 2:(这种方法比较 hack )
在业务代码里面用原生 sql 动态增减列,然后用 sql 创建索引,并且把元数据( schema )储存在某处。

方案 3:用 mongodb 。mongodb 是 schemaless 所以不用动态增减列。使用 mongo 命令来建立索引。

方案 4:用 postgres 的 jsonb 类型,和 mongo 功能几乎一致。优点是 pg 自带就有。


对 234 的评价:
虽然没有方案 1 建立索引的问题,但是多列索引的问题依旧存在:

客户打开产品,建立了一个“学号”列和一个“姓名”列。过了几天又建立了“电话号码”列,过了几天又建立了“英语成绩”列。
问题:你如何知道应该给那几列建立多列的索引?

众所周知索引应该按照查询来建立。如果经常按照(英语成绩 数学成绩 语文成绩)来排序,那么就应该为这三列建立索引。所以我的建议是对于数据量大于某个值的表,统计使用者的使用习惯,为最常使用的几种排序组合建立索引。
vhysug01
2020-06-19 14:52:49 +08:00
数据库层面的排序还是查出来再排序呢,能不能让查出来在排序
reus
2020-06-19 16:11:16 +08:00
@tuine 看见你这种回复就火起,“感觉不太合理”是什么鬼?能不能有点理性,不要凭感觉来想问题?
“造成大量索引数据”?你另外导入 es,难道就不是额外产生数据?难道 es 就不是靠索引?不想要索引,你直接全表扫描得了。
yincrow
2020-06-20 15:58:00 +08:00
每个字段就是一张表,Drupal 里就是这样的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/682939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX