2012-04-18 17 views
0

在是否將包含文本列的大型(幾百K條記錄)表分成兩個表時存在一些困難。在ORM後面帶有文本列的MySQL大表

有關商店的新聞文章表:

CREATE TABLE `article` (
    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `articleType` varchar(7) DEFAULT NULL, 
    `dateCreated` datetime NOT NULL, 
    `label` varchar(75) NOT NULL, 
    `lastUpdated` datetime NOT NULL, 
    `reporter` mediumint(8) unsigned NOT NULL, 
    `text` text NOT NULL 
    PRIMARY KEY (`id`), 
    KEY `reporter-fk` (`reporter`), 
    CONSTRAINT `reporter-fk` FOREIGN KEY (`reporter`) REFERENCES `reporter` (`id`) 
) 

所以,大不了中,當你想獲得的頭條新聞(最新消息)直接的SQL你會抓住你想要的列(ID,標籤, dateCreated會),並排除你不希望那些(特別是臃腫的文本列)

當使用ORM的工作,但是,其目的在於獲取包含所有列的,所以抓住了最近的50文章會產生一些開銷,也許並不那麼重要,但足以讓我畏縮不前因爲在寫直SQL時,我不會在這種情況下獲取所有字段。

鑑於ORM的真實性,我應該將文本列分解成單獨的相關表格還是不打擾,只需使用ORM抓取整個enchilada約定,並在網站流量要求更高效時考慮它,2表解決方案?

回答

1

通常,我說不要過早地優化。

但是,在這種情況下,我現在要解決它,因爲已經有一個參數來做到這一點。您可能正在顯示文章標題的列表,而不顯示正文。爲什麼不把身體放在與文章相關的自己的桌子/班級?

似乎文章標題和文章正文已經是兩個單獨的東西。

+0

生產中只有一個表沒有ORM,基於字符串的SQL;在開發中,我把表格分解了,因爲我無法處理(完美主義者)關於在每個查詢中包括文章文本的想法。這篇文章是關於去與ORM約定或去與SQL約定,我偏好與後者,因爲這是我所知道的最好... – virtualeyes 2012-04-18 15:06:55

1

您是否在使用特定的ORM或自制的ORM?在使用Propel的情況下,將列設置爲延遲加載 - 然後它將根據顯式請求加載,而不是與對象的其餘部分加載。如果沒有,請查看您的ORM是否支持此操作或將其構建。

+0

我使用ScalaQuery,技術上不是一個ORM,更多的功能JDBC包裝與LINQ類似SQL的能力。這很酷很重要:延遲加載特定的列,但不太可能ScalaQuery提供了這種開箱即用的映射。我應該指出,我並不反對查詢中返回的對象(事實上相當好),而是當廚房水槽被投入時對象的分量/重量。我傾向於分裂這些表格,可能會挽救頭痛...... – virtualeyes 2012-04-18 15:13:49

+0

嗯,請求赦免 - 我以爲我在你的標籤列表中看到了PHP。我的PHP已經在大腦中了!快速搜索表明ScalaQuery沒有延遲加載,但是這裏有一些關於[Hibernate中的此功能]的信息(http://stackoverflow.com/questions/2192242/what-is-lazy-loading-in-hibernate)。 – halfer 2012-04-18 15:32:08

+0

那麼,在ScalaQuery中,我可以指定列(我撒謊了一下),但是編碼方面,使用對象更好,而且在像Scala這樣的靜態類型語言中,它爲我節省了一些樣板(作爲select foo,bar, baz表示我已經指定了每一列的類型[(String,Int,Date)],然後繞過這個元組,這比僅僅使用可以獲得IDE自動完成好處的Foos列表更方便。無論如何,幸好不是PHP,花了10年的LAMP stackin',用意大利麪做的;-) – virtualeyes 2012-04-18 15:50:27