2012-04-18 1 views
0

Имея немного дилеммы, следует ли разбить на две таблицы большую (несколько сотен K записей) таблицу, содержащую текстовый столбец.MySQL большая таблица с текстовым столбцом за ORM

В таблице вопросительных магазинов новостных статей:

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 из самых последних статьи будут нести некоторые накладные расходы, возможно, не так уж и так, но достаточно, чтобы заставить меня съежиться ab так как я бы никогда не захватил все поля в этом случае при написании прямого SQL.

Учитывая реальность ORM, должен ли я разбивать текстовый столбец на отдельную связанную таблицу или не беспокоиться, просто переходите к соглашению ORM grab-the-whole-enchilada и беспокоитесь об этом, когда трафик сайта требует более эффективного , 2 столовый раствор?

ответ

1

Обычно, я говорю, преждевременно не оптимизируйте.

Однако в этом случае я бы разломил это сейчас, поскольку для этого уже есть аргумент. Вероятно, вы показываете список заголовков статей без отображения тел. Почему бы не поместить тела в свой собственный стол/класс, связанный с этой статьей?

Кажется, что заголовок статьи и тело изделия уже являются двумя отдельными вещами.

+0

В производстве есть только одна таблица без ORM, основанная на строках SQL; в развитии у меня есть таблицы, разбитые, поскольку я не мог справиться с (перфекционистской) мыслью о включении текстов статей в каждый запрос. Это сообщение идет о соглашении ORM или идет с соглашением SQL, мое предпочтение относится к последнему, поскольку это то, что я знаю лучше всего ... – virtualeyes

1

Вы используете конкретный ORM или самодельный? Если вы используете Propel, установите столбец lazy-loaded - он будет загружаться с явным запросом, а не с остальной частью объекта. Если нет, то посмотрите, поддерживает ли ваш ORM это или строит его.

+0

Я использую ScalaQuery, технически не ORM, более функциональную JDBC-обертку с LINQ -to-SQL-подобных способностей. Это круто re: ленивая загрузка определенных столбцов, но вряд ли ScalaQuery предоставляет такое отображение из коробки. Я должен указать, что я не против возвращенного объекта (ов) из запроса (довольно приятный на самом деле), а, наоборот, вес/вес объекта при входе в кухонную раковину. Я склоняюсь к разделению таблицы, скорее всего, сохранят головные боли по дороге ... – virtualeyes

+0

Ах, простите, подумал, что я видел PHP в вашем списке тегов. У меня есть PHP на мозге! Быстрый поиск предполагает, что ScalaQuery не имеет ленивой загрузки, но вот информация о [этой функции в Hibernate] (http://stackoverflow.com/questions/2192242/what-is-lazy-loading-in-hibernate). – halfer

+0

Ну, в ScalaQuery я могу указать столбцы (я немного солгал), но с кодировкой лучше работать с объектами, и на статически типизированном языке, таком как Scala, он сохраняет мне какой-то шаблон (как выбрать foo, bar, baz означает, что я задал тип каждого столбца [(String, Int, Date)], а затем передал этот кортеж, что намного менее удобно, чем просто работать со списком Foos, чтобы я мог получить полнофункциональную поддержку IDE). Во всяком случае, к счастью, не PHP, провел 10 лет LAMP stackin ', сделанный с помощью спагетти ;-) – virtualeyes