20,000表是很多表。如果您實際需要20,000張桌子,那麼沒有任何關於擁有20,000張桌子的「壞事」。我們使用innodb_file_per_table運行,所以這是一大堆文件,並且我們可能會在MySQL(innodb_open_files
,open_files_limit
,table_cache_open
)中遇到一些限制,而這些限制又受到操作系統ulimit
的限制。
再加上管理大量相同表的潛在困難。如果我需要添加一列,我需要將該列添加到20,000個表。這是20,000個ALTER TABLE語句。如果我錯過了一些表格,這些表格將不再相同。我只是不想去那裏,如果我可以幫助它。
我會建議並考慮一個不同的設計。
作爲第一個切口,這樣的:
CREATE TABLE gene_synonym
(gene VARCHAR(64)
, synonym VARCHAR(255)
, PRIMARY KEY (gene, synonym)
) ENGINE=InnoDB
;
要添加的代名詞的基因,而不是插入的值到一個特定的表的一列:
INSERT INTO gene_synonym (gene, synonym) VALUES ('alzwhatever','iforgot');
而查詢,而不是找出要查詢的20,000個表中的哪一個,我們將只查詢一個表,並在gene
列上包括一個條件:
SELECT gs.synonym
FROM gene_synonym gs
WHERE gs.gene = 'alzwhatever'
ORDER BY gs.synonym
WHERE
子句使我們可以查看一個大表的子集,返回的集合將模擬當前單個表中的一個。
如果我需要搜索的代名詞,我可以查詢僅這一個表:
SELECT gs.gene
FROM gene_synonym gs
WHERE gs.synonym = 'iforgot'
要做到這一點相同的搜索20000個表,我需要20,000種不同進行選擇,一個爲每個每個20,000張桌子。
我只是在數據類型的贓物。由於MySQL的表名限制爲64個字符,因此我將gene
列限制爲64個字符。
我們可以使用當前設計中表格的名稱填充基因列。
但是,該表無法模擬的是空表,即一個沒有任何同義詞的基因。 (或者,也許我們的設計將是該基因的名稱是自身的代名詞,所以我們就會有一個排('alzwhatever','alzwhatever')
無論哪種情況下,我們可能也想添加一個表是這樣的:
CREATE TABLE gene
(gene VARCHAR(64)
, PRIMARY KEY (gene)
) ENGINE=InnoDB
;
這是將有20000行的表,每一行對應一個在當前的設計中的表。
此外,我們還可以添加一個外鍵約束
ALTER TABLE gene_synonym
ADD CONSTRAINT FK_gene_synonym_gene (gene) REFERENCES gene (gene)
ON UPDATE CASCADE ON DELETE CASCADE
;
這種設計更符合關係數據庫的規範模式。
這並不是說其他設計是「壞」的。只是這種設計會更典型。
我會創建一個「基因」表,然後將另一個表與基因的id「交替」作爲外鍵。 – Jaime
@Jaime你是指所有基因的一個全局「替代」表?然後使用特定基因的外鍵在這個「替代」表中查找其關聯的同義詞? – Thoth
和一張染色體表。 –