V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tuine
V2EX  ›  程序员

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

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

    有个需求正在做,所有字段支持排序,而且字段是可增加的,数据库用的 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   ·   实用小工具   ·   2499 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:49 · PVG 23:49 · LAX 07:49 · JFK 10:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.