Я внес конструктивный недостаток в это приложение, над которым я работаю. Проблемная область включает сопоставление Product
с разреженной матрицей из 50 возможных атрибутов на Customer
. Есть миллионы и миллионы строк. Итак, чтобы переформулировать:
Product has_many ProductAttributes
Customer has_many ProductAttributes
Product
будет иметь свой набор ProductAttributes
для каждого Customer
.
Итак, у меня есть эта таблица из 50 миллионов строк, и подавляющее, подавляющее большинство полей пусты. Больно смотреть. Вот некоторые из моих проблем.
- Каждый продукт в среднем имеет только около 4 атрибутов.
- Чтобы сделать таблицу доступной для поиска без учета регистра, я использовал
citext
во всех столбцах атрибутов. - Первые 3 атрибута индексируются, и по ним выполняется поиск с использованием подстановочных знаков.
Я бы предпочел переделать всю эту ситуацию, используя поля HStore или JSON. Но меня беспокоит моя способность выполнять поиск против любого из них. Можно ли выполнять полнотекстовый поиск по любому из них? Ограничат ли меня пары ключ-значение HStore? В настоящее время каждый ProductAttribute
может иметь только одно значение, но я могу представить сценарий, в котором я мог бы использовать массив значений по крайней мере в одном из них. Но не убийца сделки.
Если я могу искать в JSON и/или HStore, что лучше использовать, учитывая, что я использую ActiveRecord из приложения Rails 3.2?
Другой альтернативой было бы разбить ProductAttributes
на таблицу detail
:
Product has_many CustomerProducts
Customer has_many CustomerProducts
CustomerProducts has_many ProductAttributes
Таким образом, если продукт имеет только 3 или 4 атрибута для определенного Customer
, в ProductAttributes
будет 3 или 4 записи. И я мог бы просто искать столбец значений для ProductAttribute
, возвращая родительскую запись CustomerProdct
.
Итак, три возможных подхода:
HStore
JSON
Detail table
Спасибо за любую информацию, которую вы можете предложить.