Подтвердить что ты не робот

Как бы вы реализовали очень широкую "таблицу"?

Скажем, вы моделируете объект с множеством атрибутов (2400+), намного превышающий физический предел для данного механизма базы данных (например, 1000 SQL Server). Не зная об относительной важности этих точек данных (какие из них горячие/используются чаще всего) помимо ключей домена/кандидата, как бы вы его реализовали?

A) EAV. (boo... Родные реляционные инструменты выкинули окно.)

B) Идите прямо. Первая таблица имеет первичный ключ и 1000 столбцов, вплоть до предела. Следующая таблица - 1000, внешняя - с первой. Последняя таблица - это оставшиеся 400, а также внешние ключи.

C) Равномерно распределите по таблице ceil( n / limit ). Каждая таблица имеет четное количество столбцов, внешнюю привязку к первой таблице. 800, 800, 800.

D) Что-то еще...

И почему?

Изменить: это скорее философский/общий вопрос, не связанный с какими-либо конкретными ограничениями или двигателями.

Edit ^ 2: Как указывали многие, данные, вероятно, не были нормализованы. В обычном случае деловые ограничения в то время делали глубокие исследования невозможными.

4b9b3361

Ответ 1

Мое решение: исследуйте дальше. Определите, действительно ли таблица действительно нормализована (в 2400 столбцах это кажется маловероятным).

Если нет, реструктурируйте, пока он не будет полностью нормализован (в этот момент, вероятно, будет меньше 1000 столбцов на таблицу).

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

Учитывайте только EAV для крайне малозаселенных атрибутов (желательно, не на всех).

Ответ 2

Используйте Разреженные столбцы для столбцов до 30000. Большим преимуществом над EAV или XML является то, что вы можете использовать Filtered Indexes в сочетании с разреженными столбцами для очень эффективного поиска по общим атрибутам.

Ответ 3

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

Ответ 4

Ключевым моментом для меня является эта часть:

Не зная об относительной важности этих точек данных (какие из них горячие/используются чаще всего)

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

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

Ответ 5

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

Например,

entity: id,

attrs: id, entity_id, attr_name, значение

ДОБАВ

Или как Батлер Лампсон сказал бы: "все проблемы в области информатики могут быть решены другим уровнем косвенности"

Ответ 6

Я бы повернул столбцы и сделал их строками. Вместо того, чтобы иметь столбец, содержащий имя атрибута в виде строки (nvarchar), вы могли бы иметь его как fkey обратно в таблицу поиска, которая содержит список всех возможных атрибутов.

Поворот таким образом означает:

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

Ответ 7

  • Я бы много посмотрел на модель данных более тщательно. Это третий нормальный форме? Существуют ли группы атрибутов которые должны быть логически сгруппированы вместе в свои собственные таблицы?

  • Предполагая, что это нормализовано, и   у сущности действительно есть 2400+ атрибутов, я   не было бы так быстро   модель EAV. ИМХО, это лучшее,   наиболее гибкое решение для   описанную вами ситуацию. Он дает вам встроенную поддержку разреженных данных и дает вам хорошую скорость поиска, так как значения для любого заданного атрибута можно найти в одном индексе.

Ответ 8

Я хотел бы использовать вертикальное (увеличение числа строк) подход вместо горизонтального (увеличение числа столбцов).

Вы можете попробовать этот подход, например

Таблица - id, property_name - property_value.

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