假设我的建表语句是
create table users
(
id bigint primary key,
user_name varchar(120) not null
);
现在想要为 user_name
字段新增一个唯一索引。如果是在 postgresql
中,如下 sql 是可以正常执行的
create unique index uni_user_name on users (user_name);
但在 TDSQL 环境下,这条 sql 执行失败了,报错提示
ERROR: Unique index of partitioned table must contain the hash/modulo distribution column.
TDSQL 是一款腾讯开发的分布式数据库系统,近期公司有打算兼容 TDSQL 。目前使用的数据库是 postgresql 。迁移数据时遇到了一个有关唯一索引的问题
以下是 TDSQL 官网的资料:
分布键选择原则:
create table users
(
id bigint primary key,
user_name varchar(120) not null
) distribute by shard(id);
create unique index uni_user_name_id on users (user_name, id);
可以正常执行,但这个组合的唯一索引失去了 user_name
字段唯一的限制
user_name
设置为 shard keycreate table users
(
id bigint,
user_name varchar(120) not null
) distribute by shard(user_name);
create unique index uni_user_name on users (user_name);
这种情况下,如果表有多个唯一索引,也是不行的,因为 shard key 只能是一个字段,更不要说我的业务里面还有组合的唯一索引
uni_users_user_name
,将 user_name
作为主键和 shard key 。创建一个触发器,在新增或者修改时,也去修改 uni_users_user_name
,通过 uni_users_user_name
来校验 user_name
是否唯一这种方案我并没有实践,一方面触发器现在已经很少使用了,使用的话会对现有的业务造成哪些影响也需要评估。另一方面,多个唯一索引需要建立多张表,如果组合唯一索引的话,又应该怎么处理呢?
create table uni_users_user_name
(
user_name varchar(120) primary key,
id bigint
) distribute by shard(user_name);
我想这个问题应该在其他分布式数据库中也存在的,但目前好像并没有好的解决方案。我去咨询了官方客服,她们给我的反馈是分布式数据库是有挺多的限制,建议我使用她们的 postgresql
我想问问各位,有没有较好的方案可以在不改动业务,或者小改动的情况下,解决业务上强依赖数据库唯一索引的问题
1
mark2025 68 天前
普通项目根本用不到分布式数据库,单机 pg 数据库足以。不要自己给自己挖坑
|
2
mark2025 68 天前 1
分布式数据库是不是伪需求?
https://pigsty.cc/zh/blog/db/distributive-bullshit/ |
4
263 68 天前
|
7
bthulu 67 天前
那就不用唯一索引, 程序里控制好唯一性就行了. 你事先跟领导说清楚有风险, 万一出事了, 让领导背锅就好了.
|