跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 所有字段支持排序,有 v 友有好的解决方案吗
未分類
27 6 月 2020

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

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

資深大佬 : tuine 4

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

大佬有話說 (9)

  • 資深大佬 : guyeu

    当你觉得一个东西的设计很傻逼,说明要不然需求有问题,要不然对需求的理解有问题。。。

  • 資深大佬 : Liutos

    砍需求

  • 資深大佬 : reus

    要排序就加索引啊,有什么问题?
    表结构 key, value 就行了
    索引这样建:create index on xxx using btree((value)) where key = ‘foo’
    加一个字段就建一个索引,反正你的字段也不会无限多吧?
    需求不傻逼,需求也不用砍,因为你用的是 pg,pg 支持 partial index

  • 主 資深大佬 : tuine

    @guyeu
    @Liutos
    需求确实很傻逼,老板说给我一个充分的理由,不然就需要这个!

  • 主 資深大佬 : tuine

    @reus
    加索引也考虑过,但是感觉不太合理,而且会造成大量索引数据

  • 資深大佬 : crclz

    (某张表)所有字段支持排序,而且字段是可增加的

    方案 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

    数据库层面的排序还是查出来再排序呢,能不能让查出来在排序

  • 資深大佬 : reus

    @tuine 看见你这种回复就火起,“感觉不太合理”是什么鬼?能不能有点理性,不要凭感觉来想问题?
    “造成大量索引数据”?你另外导入 es,难道就不是额外产生数据?难道 es 就不是靠索引?不想要索引,你直接全表扫描得了。

  • 資深大佬 : yincrow

    每个字段就是一张表,Drupal 里就是这样的

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具