首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >替换过大的组合键

替换过大的组合键
EN

Stack Overflow用户
提问于 2019-06-24 15:16:19
回答 1查看 68关注 0票数 2

我正在尝试为给定的问题找到最佳解决方案:

我有一个实体(让我们称它为Collateral),它由几个字段组成。此实体的唯一性由4个字段(我们称它们为:user_id (bigint)device_id(varcha(9))key_id(varchar(2732))application_id(varchar(255)))的组合定义

此表是使用hibernate生成的。我已经尝试将这4个字段移动到一个单独的实体(CollateralEmbeddedEntity )以将其用作嵌入的Id,并在Collateral entity中创建这4个字段的约束:

代码语言:javascript
复制
@Table(
    name="COLLATERAL",
    uniqueConstraints=
    @UniqueConstraint(name = "comp_key", columnNames={"device_id", "application_id", "key_id", "user_id"}))

问题是,在这两种情况下,字段都超过了MariaDB密钥的最大允许长度:

代码语言:javascript
复制
java.sql.SQLException: Specified key was too long; max key length is 3072 bytes

不能更改dbCharset编码(排序规则)或缩小字段varchar范围本身。

我考虑的是生成和存储这4个字段的散列,并给它一个唯一的约束(无论如何,搜索和更新总是基于这4个字段),但是,我不确定这样的解决方案是否合适,因为我们用冗余信息违反了数据库规范化。

使用散列的解决方案真的是一个好的解决方案吗?如果不是,对于给定的问题,更好的替代方案是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 00:40:57

规范化证书密钥:

代码语言:javascript
复制
CREATE TABLE CertKeys (
    cert_id INT UNSIGNED AUTO_INCREMENT,
    cert_key VARCHAR(2732) NOT NULL,   -- base64 encoded
    -- or:  cert_key VARBINARY(2049) NOT NULL,   -- binary
    PRIMARY KEY (cert_id),
    UNIQUEY (cert_key) ) ENGINE=InnoDB;

然后在另一个表和您正在讨论的复合INDEX中使用cert_id

在新表中插入cert_key并获取cert_id需要一个额外的步骤。这是在插入主表之前完成的。

它不那么重要,但您也可以考虑规范化application_id

(是的,可以使用散列设计一种不同的技术,但我认为这更简洁。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56731533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档