Эффективная структура таблицы базы данных

Рассмотрим Microsoft SQL Server 2008

Мне нужно создать таблицу, которая может быть создана двумя различными способами следующим образом.

Structure Columnwise
StudentId number, Name Varchar, Age number, Subject varchar
eg.(1,'Dharmesh',23,'Science')
   (2,'David',21,'Maths')


Structure Rowwise
AttributeName varchar,AttributeValue varchar
eg.('StudentId','1'),('Name','Dharmesh'),('Age','23'),('Subject','Science')
   ('StudentId','2'),('Name','David'),('Age','21'),('Subject','Maths')

в первом случае записей будет меньше, но при втором подходе это будет в 4 раза больше, а 2 столбца уменьшены.

Итак, какой подход лучше с точки зрения производительности, дискового хранилища и повторной проверки данных?

2 ответа

Решение

Ваш второй подход обычно известен как дизайн EAV - Entity-Attribute-Value.

ИМХО, 1-й подход полностью. Это позволяет вам правильно вводить столбцы, обеспечивая наиболее эффективное хранение данных, а также значительно упрощает и повышает эффективность запросов.

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

Распространенная причина, по которой люди идут по маршруту EAV, заключается в моделировании гибкой схемы, что относительно сложно сделать эффективно в RDBMS. Другие подходы включают хранение данных в полях XML. Это одна из причин, по которой NOSQL (нереляционные) базы данных могут оказаться очень полезными из-за их бессхемного характера (например, MongoDB).

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

  1. Наличие имен атрибутов в качестве varchars сделает невозможным изменение имен, типов данных или применение любого вида проверки
  2. Будет невозможно проиндексировать желаемые действия поиска
  3. Сохранение целых чисел, поскольку varchars будет занимать больше места
  4. Упорядочение, добавление или суммирование целых чисел будет головной болью и будет иметь плохую производительность
  5. Язык программирования, использующий эту базу данных, не будет иметь возможности иметь строго типизированные данные.

Есть много других причин для использования первого подхода.

Другие вопросы по тегам