Для широкого стола:
- Быстрый отчет о том, что он предположительно денормализован и поэтому соединения не нужны.
- Легко понять для конечных потребителей, поскольку им не нужно держать модель данных в голове.
Против широкого стола:
- Вероятно, необходимо иметь несколько составных индексов, чтобы получить хорошую производительность запросов
- Более сложно поддерживать согласованность данных, т. Е. Необходимо обновлять несколько строк при изменении данных, если эти данные находятся в нескольких строках
- Поскольку вам приходится обновлять несколько строк и поддерживать несколько индексов, одновременная производительность для обновлений может стать проблемой по мере увеличения блокировок.
- Вы можете получить записи с множеством пустых значений в столбцах, если атрибут не имеет отношения к объекту в этой строке, что может затруднить обработку результатов.
- Если ленивые разработчики делают
SELECT *
из таблицы, вы в конечном итоге перетаскиваете множество данных по сети, поэтому вам, как правило, приходится поддерживать подходящие представления подмножеств.
Так что все действительно зависит от того, что вы делаете. Если основной целью таблицы является создание отчетов OLAP, а обновления происходят нечасто и затрагивают несколько строк, то, возможно, правильной будет широкая денормализованная таблица. В среде OLTP это, вероятно, не так, и вы должны предпочесть более узкие таблицы. (Я обычно проектирую в 3NF, а затем по мере продвижения делаю денормализацию для производительности запросов.)
Вы всегда можете использовать подход нормализации и предоставления широкого обзора для читателей, если это то, что они хотят видеть.
Не зная больше о ситуации, на самом деле невозможно сказать больше о плюсах и минусах в ваших конкретных обстоятельствах.
Edit:
Учитывая то, что вы сказали в своих комментариях, рассматривали ли вы просто иметь длинную и тощую таблицу пар имя-значение, чтобы у вас были только столбцы UserId, PropertyName, PropertyValue? Возможно, вы захотите добавить в него и другие метаатрибуты; метка времени, версия или что-то еще. SQL Server достаточно эффективен в обработке таких таблиц, поэтому не стоит сбрасывать со счетов простое решение, подобное этому.