SailsJS / Waterline — Как использовать «строковый» индекс в моделях и ассоциациях?

Вопрос новичка здесь.

Согласно https://github.com/balderdashy/waterline#indexing, вы не можете использовать строку ' тип данных в качестве индекса в Waterline из-за проблем с нечувствительностью к регистру:

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

Меня беспокоят следующие проблемы: производительность; ассоциации с использованием «строковых» ключей невозможны.

Мои вопросы:

  1. Действительно ли он индексирует строки, если ему сказали это сделать? Если да, то на чем основан индекс: а) исходная строка как есть; б) нижний регистр строки; c) ЗАГЛАВНЫМИ буквами строки?
  2. Если он вообще не индексирует строки, как подразумевается, если вы можете предположить, что «не может использовать» означает «не создает», значит ли это, что бэкэнд Waterline/базы данных выполняет неиндексированное извлечение запись за записью и сравнить? Кажется крайне неэффективным, если это так.
  3. Затрагиваются ли оба типа данных «строка» и «текст» или я могу использовать «текст», и в этом случае на вопрос № 2 также необходимо ответить для типов данных «текст».
  4. Если вы действительно не можете использовать «строку», что мне следует использовать вместо внешних ключей? Целочисленный идентификатор и таблица соединений для привязки другой таблицы со строковыми значениями? (Кажется расточительным, но пригодным для чего-то вроде списка ключевых слов).
  5. Если и когда эта «проблема» будет решена?
  6. Какие и/или где «обсуждаются обходные пути»?
  7. Есть ли лучший ORM, на который я должен обратить внимание, или просто использовать собственные методы SQL (к вашему сведению, я использую PostgreSQL).

Я надеялся получить ответ здесь: «строка» может быть проиндексирована, но запросы к типам данных «строка» выполняются с использованием нижнего регистра (или верхнего регистра, но дайте мне знать). Таким образом, у меня может быть «строковый» ключ, если регистр правильный.

Кроме того, я предполагаю, что «строка» и «текст» фактически являются синонимами в Waterline, по крайней мере, вне родного контекста базы данных.

Заранее спасибо за любую помощь здесь.


person Kenneth Benjamin    schedule 16.09.2014    source источник


Ответы (1)


TL;DR: не беспокойтесь об этом.

Здесь нужно сделать два замечания:

  1. Примечание, на которое вы ссылаетесь, на самом деле предназначено для объяснения того, почему свойство unique (в настоящее время) не работает должным образом для строковых атрибутов.

  2. Это относится в основном к MongoDB.

Когда вы создаете ассоциации между двумя моделями в Sails, всегда используются первичные ключи; текущая версия Waterline не поддерживает указание поля внешнего ключа. Когда Sails создает таблицу в вашей базе данных Postgres, он автоматически добавит индекс PRIMARY KEY к первичному ключу модели (по умолчанию id или любой атрибут, который вы назначите с помощью свойства primaryKey, если вы установите autoPk на false для модели). Это происходит для любого типа столбца. Упомянутая вами проблема относится к настраиваемым индексам строковых типов. Итак, все должно работать так, как вы ожидаете, используя строковые столбцы в качестве ключей в Postgres, включая ассоциации.

person sgress454    schedule 17.09.2014
comment
Я получаю ужасные результаты с парусами-mysql, я просматривал индексацию из-за увеличения производительности, которое она приносит. Но похоже, что Sailes-MySQL уже "правильно" индексирует с идентификатором по умолчанию, заданным в моделях? @sgress454 - person cfl; 08.04.2016