有个需求正在做,所有字段支持排序,而且字段是可增加的,数据库用的 pgsql,目前想的是同步到 ES,然后进行排序......
1
guyeu 2020-06-19 11:35:08 +08:00
当你觉得一个东西的设计很傻逼,说明要不然需求有问题,要不然对需求的理解有问题。。。
|
2
Liutos 2020-06-19 13:38:06 +08:00
砍需求
|
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 |
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 建立索引的问题,但是多列索引的问题依旧存在: 客户打开产品,建立了一个“学号”列和一个“姓名”列。过了几天又建立了“电话号码”列,过了几天又建立了“英语成绩”列。 问题:你如何知道应该给那几列建立多列的索引? 众所周知索引应该按照查询来建立。如果经常按照(英语成绩 数学成绩 语文成绩)来排序,那么就应该为这三列建立索引。所以我的建议是对于数据量大于某个值的表,统计使用者的使用习惯,为最常使用的几种排序组合建立索引。 |
7
vhysug01 2020-06-19 14:52:49 +08:00
数据库层面的排序还是查出来再排序呢,能不能让查出来在排序
|
8
reus 2020-06-19 16:11:16 +08:00
@tuine 看见你这种回复就火起,“感觉不太合理”是什么鬼?能不能有点理性,不要凭感觉来想问题?
“造成大量索引数据”?你另外导入 es,难道就不是额外产生数据?难道 es 就不是靠索引?不想要索引,你直接全表扫描得了。 |
9
yincrow 2020-06-20 15:58:00 +08:00
每个字段就是一张表,Drupal 里就是这样的
|