FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

主键支持设置索引类型-二叉树或者哈希

Open ensleep opened this issue 2 years ago • 3 comments

Feature 特性

// c# code
[Column(IsPrimary=true,UseHASH=true)]
public string USER_ID{get;set;}

简要描述原因

这个框架其实主要还是用在Codefirst的场景,并且是作为基础底座使用,会面临好多的数据库情况,不同的排序规则甚至同一套代码用在不同环境下,他们数据库排序规则不一样。这使得主键只能使用雪花算法或者abp中那种特殊的guid,对于众多子项目的系统,大家并非都能生成一致的seqguid过雪花算法,加上k8s部署以及弹性伸缩的需要,特殊的有序主键需要多个部门共同协作,这并不容易。 所以,如果能够提供哈希索引类型的主键,会解决很大的问题,使用uuidv4做主键的系统,从来就没打算通过这个主键进行范围查找或者排序,一旦使用哈希索引,数据库便不会因此产生过多的碎片,也不会出现雪花算法的时钟回播问题,更不会出现弹性伸缩无法正确设置workerid的问题。

使用场景

默认使用guid做为主键的新老系统,不再为有序id的问题所纠结,不必为人工维护数据库中guid数据类型而纠结。也不需要让所有的子系统都统一某一个非正式的有序id。

ensleep avatar Oct 21 '23 18:10 ensleep

对应的表结构 DDL 代码是什么

2881099 avatar Oct 22 '23 05:10 2881099

@2881099 我知道直接在数据库中操作的DDL,但是,在FREESQL考虑不同的数据库类型以及兼容性,应该是什么样的DDL。

在PostgreSQL中可以通过以下方式将表的主键索引设置为哈希索引:

  1. 创建表时使用 USING HASH 子句指定主键索引为哈希索引:
CREATE TABLE t (
    id bigint PRIMARY KEY USING HASH, 
    data text
);
  1. 对已存在表使用 CREATE INDEX 来创建哈希索引作为主键索引:
CREATE INDEX ON t USING HASH (id);

ALTER TABLE t ADD PRIMARY KEY USING INDEX t_id_hash;

在Oracle数据库中,可以通过以下几种方式将表的主键索引设置为哈希索引:

  1. 创建表时使用 HASHKEYS 子句指定主键列为哈希索引:
CREATE TABLE t(
   id NUMBER PRIMARY KEY, 
   name VARCHAR2(50)
) 
HASHKEYS (id);
  1. 对已存在表使用 CREATE INDEX 语句创建哈希索引:
CREATE INDEX t_pk ON t(id) TABLESPACE tbs HASHKEYS (id);

ensleep avatar Oct 22 '23 12:10 ensleep

IndexAttribute 目前有属性 IndexMethod 可以设置 pgsql

2881099 avatar Oct 22 '23 16:10 2881099