База данных моделирования: много маленьких таблиц или нет? - PullRequest
0 голосов
/ 29 июля 2010

У меня есть база данных с некоторой информацией, которая повторяется в некоторых таблицах.

Я хочу знать, интересно ли создавать таблицу с этой информацией, а в другую таблицу я помещаю только идентификатор.

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

(я работаю с Symfony, если он что-то меняет)

Ответы [ 4 ]

1 голос
/ 25 ноября 2010

Это не вопрос стиля.

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

Теперь Integer FK может быть «аккуратным», но подойдет любой хороший короткий ключ фиксированной длины.Ключи переменной длины очень плохо влияют на производительность, так как ключ необходимо распаковывать при каждом поиске в индексе.

Природа нормализованной базы данных - это большие таблицы меньшего размера, что намного быстрее, чем куча ненормализованных данныхс меньшим количеством больших таблиц.Привыкайте к этому.

Пока вы присоединяетесь к ключам, объединения сами по себе ничего не стоят;десять соединений для постройки ряда не стоят больше пяти.Стоимость указана в таблице размеров;используемые индексы;распространение;типы данных столбцов индекса;и т. д. Реляционные базы данных тщательно спроектированы для нормализованных баз данных.

Если вам нужно выполнить поиск, то это так.Просто убедитесь, что таблицы нормализованы.

1 голос
/ 29 июля 2010

Вы говорите о Нормализация .Как и во многих аспектах дизайна, это компромисс.

Наличие дублирования в базе данных приводит ко многим проблемам - например, как сохранить эти дубликаты в шаге при обновлении данных.Таким образом, вставки и обновления могут идти медленнее из-за дублирования.Следовательно, мы склонны нормализовать базу данных, чтобы избежать такого дублирования.Это приводит к более сложным запросам и, возможно, некоторым затратам на поиск.

Современные продукты баз данных, как правило, выполняют такие запросы действительно хорошо, если вы позаботитесь о том, чтобы правильно указали индексы.

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

1 голос
/ 29 июля 2010

Звучит так, будто рассматриваемая «информация» - это данные, составляющие ключевые значения. Если это так, кажется, что разработчик базы данных любит использовать естественные ключи и что вы предпочитаете использовать суррогатные ключи.

Во-первых, это всего лишь вопрос стиля. Если значения естественного ключа являются составными (то есть включают в себя более одного столбца) и включены в другие столбцы для обеспечения целостности данных, то они не являются избыточными.

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

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

0 голосов
/ 29 июля 2010

Если вы не нормализуете

  • Как вы собираетесь хранить значения, которые потенциально могут быть использованы?
  • Как вы собираетесь отделить «Поиск значения» от «Взгляд»значение up из «LookUpValue» и т. д.
  • Вы будете работать медленнее, потому что храните строку переменной «Значение поиска» во многих строках, а не красивую чистую целочисленную клавишу

Этоэто более практичные пункты к другим 2 ответам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...