我想尽可能多地使用规范化。但是,只是无法绕过这一个。
假设我有这样的财务数据:
分类帐#| dimension1 | dimension2 | DIMENSION34000 | 100 | 200 | 300
5113 | 100 | 298 | 300
我需要确保这4列的每个组合都是唯一的。我知道唯一约束,所以我在所有提到的列上都添加了“唯一”。
但是......如果维度列的数量必须为25,那么将会有25个维度列而不是提到的3个列?我将如何使用唯一约束?我知道一个约束只能容纳16列或3072个字节,不再存在。
我在考虑使用某种哈希值,但还没弄清楚如何做到这一点。
任何人都可以通过提供想法/信息/示例来帮助我吗?
如果在没有独特约束的情况下实现这一目标存在完全不同的想法,我会全神贯注地听到它!
答案 0 :(得分:0)
选项1:
CREATE TABLE bigboy (
ledger_sub1 int unsigned not null COMMENT 'foreign key me...',
ledger_sub2 int unsigned not null COMMENT 'forgein key me...'
PRIMARY KEY (ledger_sub1,ledger_sub2)
)
CREATE TABLE bigboy_sub1 {
ledger int unsigned auto_increment,
dim01 int unsigned not null,
...
dim15 int unsigned not null,
PRIMARY KEY (ledger),
UNIQUE KEY uk1 (dim01..dim15)
)
CREATE TABLE bigboy_sub2 {
ledger int unsigned auto_increment,
dim16 int unsigned not null,
...
dim30 int unsigned not null,
PRIMARY KEY (ledger),
UNIQUE KEY uk1 (dim16..dim30)
)
ledger_sub1 = INSERT IGNORE INTO bigboy_sub1(dim01..dim15) and return ledger;
ledger_sub2 = INSERT IGNORE INTO bigboy_sub2(dim16..dim30) and return ledger;
its_unique = INSERT IGNORE INTO bigboy(ledger_sub1,ledger_sub2);
选项2:
CREATE TABLE bigboy {
ledger int unsigned auto_increment,
dim01 int unsigned not null,
...
dim30 int unsigned not null,
bigboy_uniq VARCHAR(301) not null,
PRIMARY KEY (ledger),
UNIQUE KEY uk1 (bigboy_uniq)
);
where bigboy_uniq = concatenation of LPAD'ed dim01..dim30
2选项:
CREATE TABLE bigboy {
ledger int unsigned auto_increment,
dim01 int unsigned not null,
...
dim30 int unsigned not null,
fingers_crossed VARCHAR(32) not null,
PRIMARY KEY (ledger),
UNIQUE KEY uk1 (fingers_crossed)
);
where fingers_crossed = md5 of LPAD'ed dim01..dim30 string
(免责声明 - 我不会单独使用任何这些,除非黑客攻击)