2013-07-19 31 views
2

我的任務包括從創建一個不斷更新的MySQL表閱讀:有沒有關於保存MySQL表格額外信息的標準?

CREATE TABLE mailing (
    addr VARCHAR(255) NOT NULL 
); 

(無DATE_CREATED字段或任何東西,那種隨心所欲,我知道,但是這是我給的)

此表應該擁有數百萬個電子郵件地址,而且每天都會增加更多。

我應該指望從所有域的最後30天,此表在單獨的一個日常的成長,我與創造:

CREATE TABLE domain_count (
    domain VARCHAR(255) NOT NULL PRIMARY KEY, 
    total_count INT(11) NOT NULL DEFAULT 0, 
    count_1 INT(11) NOT NULL DEFAULT 0, 
    count_2 INT(11) NOT NULL DEFAULT 0, 
    ... 
    count_30 INT(11) NOT NULL DEFAULT 0 
); 

如果說,第1天的郵件表中包含10個地址從一個單一的域,並在第2天它包含15個地址,然後我想爲domain_count.count_1 = 10和domain_count.count_2 = 5

爲此,我需要跟蹤2件事情:其中一個是截至昨天郵件列表中的地址總數(因此第二天我應該在某處存儲「10」,第三天我應該將「15」存儲一些回覆;有了這個,我可以從郵件列表的第11/16列繼續搜索)。另一個是最新的count_#值,因爲我需要知道在第2天插入count_2(並在第31天循環回count_1)。

我可以很容易地將這些值存儲在一個單獨的文件中,但是做這樣的事情感覺非常混亂。是否有MySQL查詢可以讓我將這些值與表本身相關聯?

回答

1

對於你所描述的沒有標準,沒有。

還有INFORMATION_SCHEMA,其中部分SQL標準。 TABLES表有一列TABLE_ROWS,但這隻顯示當前的行數。

要做你所描述的,我會創建另一個基於TABLES表的常規表,添加一個TIMESTAMP列,並定期將I_S表中的行復制到我自己的表中。

CREATE TABLE mydatabase.TABLES like INFORMATION_SCHEMA.TABLES; 

ALTER TABLE mydatabase.TABLES ADD COLUMN updated_at TIMESTAMP; 

/* once per day do the following: */  
INSERT INTO mydatabase.TABLES 
SELECT *, NOW() FROM INFORMATION_SCHEMA.TABLES 
WHERE (table_schema, table_name) = ('mydatabase', 'mytable'); 
1

爲了回答您的具體問題:對報告數據的這種聚集和denormalisation的東西,通常由data warehouse而不是由DBMS覆蓋。

爲了幫助您的問題,一個整潔的結構可能如下:

CREATE TABLE `domain_count` (
    `domain` VARCHAR(255) NOT NULL PRIMARY KEY, 
    `date` DATE NOT NULL, 
    `count` INT(11) NOT NULL DEFAULT 0 
); 

它仍然分離從數據本身的數據的集合,但你可能會發現結構更容易查詢您的要求。您可以使用date range/BETWEEN運算符來獲得您感興趣的範圍,並計算總計或使用GROUP BY按域,月份等進行分組。