Сохранять и запрашивать массив или группу слов в MYSQL и PHP - PullRequest
1 голос
/ 03 июня 2019

Я работаю над проектом, использующим PHP / MYSQL в качестве серверной части для приложения IOS, в котором широко используются словари и массивы, содержащие текст или строки.

Мне нужно сохранить этот текст в MYSQL(из массива строк srtrings на телефоне), а затем запросить, чтобы увидеть текст, содержащий (без учета регистра) слово или фразу, о которой идет речь.

Например, если массив состоит из {Ford, Chevy, Toyota, BMW, Buick}, я мог бы запросить его, чтобы увидеть, что он содержит Saab.

Я знаю, что хранение массивов в поле не подходит для MYSQL, поскольку предотвращает оптимизацию.Однако было бы слишком сложно создавать отдельные таблицы для этих наборов слов, которые создаются пользователями.

Поэтому я ищу разумный способ их хранения, возможно, разделенный пробелами или запятыми, который делает возможным достаточно эффективный поиск.

Если они хранятся через пробел, я собираю васможет сделать что-то с помощью регулярных выражений, например:

SELECT 
    *
FROM
    `wordgroups`
WHERE
    wordgroup regexp '(^|[[:space:]])BLA([[:space:]]|$)';

Но это кажется странным.

Есть ли лучший способ сделать это?Спасибо за любые идеи

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Рассмотрите возможность использования индекса FULLTEXT. И используйте MATCH(...) AGAINST(... IN NATURAL LANGUAGE MODE).

FULLTEXT очень быстро для "слов", и IN NATURAL MODE может решить ваш Saab пример.

0 голосов
/ 03 июня 2019

Использование regexp может привести к тому, что вы хотите, однако ваш запрос будет неэффективным, поскольку он не может полагаться ни на какие индексы.

Если вы хотите сохранить список слов, а их позиция в массиве - нетвопрос, то вы можете хранить их в одном поле, разделенном пробелом.Но вместо использования регулярного выражения используйте полнотекстовое индексирование и поиск .Этот метод имеет явное преимущество перед поиском с помощью регулярного выражения: он использует индекс.Он также имеет некоторые недостатки: есть список стоп-слов (они исключены из поиска), а также минимальная длина слова.Хорошей новостью является то, что эти параметры настраиваются.Кроме того, вы получаете все недостатки хранения данных в поле с разделителями, как подробно описано в Действительно ли плохо хранить список с разделителями в столбце базы данных? вопрос здесь на SO.

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

В этом случае я хотел бы рассмотреть вопрос о том, является ли mysql правильным выбором.для хранения моих данных в первую очередь.Если у вас есть многомерные списки или списки, содержащие списки, то я бы определенно выбрал другое решение nosql.

Если вам нужны только простые двумерные списки / словари, то вы можете сохранить их все водна таблица с такой же структурой, как показано ниже:

list_id - unique identifier of the list, primary key
user_id - id of the user the list belongs to
key - for dictionaries this is the lookup field (indexed), for other lists it may store the position of the element. String data type.
value - the field holding the value (indexed). Data type should be string, so that it could hold different data types as well.

Поиск, чтобы определить, содержит ли список определенное значение, был бы быстрым и эффективным поиском с использованием индекса в полях ключа или значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...