Производительность MySQL / Rails: одна таблица, много строк против многих таблиц, меньше строк? - PullRequest
1 голос
/ 28 апреля 2009

В моем приложении Rails есть несколько моделей, связанных с активами (вложения, картинки, логотипы и т. Д.). Я использую attachment_fu, и до сих пор у меня есть 3 разных таблицы для хранения информации в моей базе данных MySQL.

Мне интересно, будет ли разница в производительности, если я использую STI и помещу всю информацию в одну таблицу, используя столбец типа и имея разные унаследованные классы. Это будет более СУХОЙ и проще в обслуживании, потому что все они имеют много атрибутов и характеристик.

Но что быстрее? Много таблиц и меньше строк на таблицу или только одна таблица с большим количеством строк? Или вообще нет разницы? Мне придется иметь дело с большим количеством информации и множеством запросов в секунду.

Спасибо за ваше мнение!

Ответы [ 3 ]

6 голосов
/ 28 апреля 2009

Множество таблиц и меньше строк, вероятно, быстрее.

Не поэтому вы должны это делать: ваша база данных должна моделировать ваш проблемный домен. Одна таблица - плохая модель многих типов сущностей. Таким образом, вы в конечном итоге напишите много-много кода, чтобы найти подмножество этой таблицы, представляющее тип сущности, который вас интересует.

Обычный, принятый, чистый код базы данных и интерфейсного клиента не будет работать из-за вашей единой таблицы "все есть, а не все".

Это медленнее, более хрупко, умножит ваш код во всем приложении и сделает плохую модель.

Делайте это только , если все вещи имеют абсолютно одинаковые атрибуты и одинаковое (или, возможно, заменяемое Лисковым) семантическое значение в вашей проблемной области.

В противном случае, даже не пытайтесь сделать это.

Или, если вы это сделаете, спросите, почему это лучше, чем иметь одну большую карту / хэш-таблицу / ассоциативный массив для хранения всех сущностей в вашем приложении (и множества функций, большинство из которых дублированы, вырезаны и вставлены, а также из дата выполнения switch дел или RTTI, чтобы выяснить реальный тип каждого объекта).

2 голосов
/ 28 апреля 2009

Единственный способ узнать наверняка - это попробовать оба подхода и измерить производительность.

В общих чертах это зависит от того, выполняете ли вы объединения между этими таблицами и, если да, то как эти таблицы индексируются. Вообще говоря, объединения баз данных являются дорогостоящими, поэтому схемы базы данных иногда денормализуют для повышения производительности. Обычно этого не происходит, пока вы не столкнетесь с серьезным объемом данных, то есть миллионами записей. У вас, вероятно, еще нет этой проблемы и, возможно, никогда не будет.

0 голосов
/ 16 марта 2011

Если строки имеют одинаковые атрибуты, тогда да, одна таблица лучше, и только одна строка для указания типа данных, в противном случае используйте разные таблицы, чтобы справиться с этим, что лучше по производительности, объему кода и даже по доступности Код также.

...