所有字段支持排序,有 v 友有好的解决方案吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tuine
V2EX    程序员

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

  •  
  •   tuine 2020-06-19 10:23:11 +08:00 via iPhone 2442 次点击
    这是一个创建于 1941 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    9 条回复    2020-06-20 15:58:00 +08:00
    guyeu
        1
    guyeu  
       2020-06-19 11:35:08 +08:00
    当你觉得一个东西的设计很傻逼,说明要不然需求有问题,要不然对需求的理解有问题。。。
    Liutos
        2
    Liutos  
       2020-06-19 13:38:06 +08:00
    砍需求
    reus
        3
    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
        4
    tuine  
    OP
       2020-06-19 14:37:11 +08:00
    @guyeu
    @Liutos
    需求确实很傻逼,老板说给我一个充分的理由,不然就需要这个!
    tuine
        5
    tuine  
    OP
       2020-06-19 14:44:27 +08:00
    @reus
    加索引也考虑过,但是感觉不太合理,而且会造成大量索引数据
    crclz
        6
    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
        7
    vhysug01  
       2020-06-19 14:52:49 +08:00
    数据库层面的排序还是查出来再排序呢,能不能让查出来在排序
    reus
        8
    reus  
       2020-06-19 16:11:16 +08:00
    @tuine 看见你这种回复就火起,“感觉不太合理”是什么鬼?能不能有点理性,不要凭感觉来想问题?
    “造成大量索引数据”?你另外导入 es,难道就不是额外产生数据?难道 es 就不是靠索引?不想要索引,你直接全表扫描得了。
    yincrow
        9
    yincrow  
       2020-06-20 15:58:00 +08:00
    每个字段就是一张表,Drupal 里就是这样的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1476 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 16:26 PVG 00:26 LAX 09:26 JFK 12:26
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86