簡體   English   中英

替代太大的組合鍵

[英]Substitution for too large composite key

我正在嘗試為給定問題找到最佳解決方案:

我有一個實體(我們稱之為Collateral ),它由幾個字段組成。 該實體的唯一性由 4 個字段的組合定義(我們稱它們為: user_id (bigint)device_id(varcha(9))key_id(varchar(2732))application_id(varchar(255))

這個表是用休眠生成的。 我已經嘗試將這 4 個字段移動到一個單獨的實體 ( CollateralEmbeddedEntity ) 以將其用作嵌入式 Id,並在Collateral Entity 中的這 4 個字段上創建約束:

@Table(
    name="COLLATERAL",
    uniqueConstraints=
    @UniqueConstraint(name = "comp_key", columnNames={"device_id", "application_id", "key_id", "user_id"}))

問題是在這兩種情況下,這些字段都超過了 MariaDB 密鑰的最大允許長度:

java.sql.SQLException: Specified key was too long; max key length is 3072 bytes

更改 dbCharset 編碼(排序規則)或縮小字段 varchar 范圍本身不是一種選擇。

我想到的是生成並存儲這 4 個字段的散列並為其提供唯一約束(無論如何,搜索和更新將始終基於這 4 個字段)但是,我不確定這樣的解決方案是否合適因為我們用冗余信息違反了數據庫規范化。

散列的解決方案實際上是一個好的解決方案嗎? 如果不是,對於給定的問題,更好的選擇是什么?

規范化證書密鑰:

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

(是的,可以使用哈希設計一種不同的技術,但我認為這更簡潔。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM