Лучший способ хранения и извлечения синонимов в базе данных mysql

StackOverflow https://stackoverflow.com/questions/3974671

  •  09-10-2019
  •  | 
  •  

Вопрос

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

Когда пользователи поступают следующие: Word1

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

Соответствие (столбчатую) против ((Word1a Word1b Word1c) в логическом режиме)

Так как я могу хранить синонимы в таблице? Я нашел 2 варианта:

  1. Использование ключа и словных столбцов, как

    val  keyword
    -------------
    1    word1a
    1    word1b
    1    word1c
    2    word2a
    2    word2b
    3    word3a
    etc.
    

Итак, я могу найти точное совпадение введенного слова в одном запросе и найти его идентификатор. В следующем выборе я получаю все слова с этим идентификатором и как-то оказываете их с помощью петли записи в Server Side Langauge. Затем я могу построить настоящий поиск на главной таблице, который мне нужно искать слова.

  1. Использование только слов столбцов, как

    word1a|word1b|word1c
    word2a|word2b|word2c
    word3a
    

Теперь я так выбираю для моего слова, если он находится внутри каких-либо записей, если оно есть, извлечь всю запись и взорвать его в | И у меня снова мои слова, которые я могу использовать.

Этот второй подход проще подходит для поддержания для того, кто сделает эту базу данных синонимов, но я вижу 2 проблемы:

а) Как я могу найти в MySQL, если слово находится внутри строки? Я не могу не понравиться «Word1a», потому что синонимы могут быть очень похожими так, как Word1a может быть народнику, а дробедители могут быть птицами, а слово 2А может быть ягода. Очевидно, мне нужно точное совпадение, так как как можно понравиться выписки точное совпадение внутри строки?

б) Я вижу проблему скорости, используя, как я думаю, займет больше MySQL, чем «=», используя первый подход, в котором я точное соответствие слова. С другой стороны, в первом варианте мне нужно 2 оператора, чтобы получить идентификатор слова и секунды, чтобы получить все слова с этим идентификатором.

Как бы вы решили эту проблему, больше дилемма, который подходит для взять? Есть ли третий способ, которым я не вижу, что это легко для администратора, чтобы добавить / редактировать синонимы и в то же время быстро и оптимально? Хорошо, я знаю, что обычно нет лучшего способа ;-)

ОБНОВИТЬ: Решение использовать две таблицы один для главного слова и секунды для слов синоним не будет работать в моем случае. Потому что у меня нет главного слова, которое типы пользователей в поле поиска. Он может набрать любой из синонимов в поле, поэтому мне все еще интересно, как установить эти таблицы, так как у меня нет главных слов, которые у меня будет идентификатор в одном столе и синонимах с идентификатором мастера во второй таблице. Там нет главного слова.

Это было полезно?

Решение

Не используйте (одну) строку для хранения разных записей.

Другими словами: построить таблицу Word (Word_id, Word) и таблицу Synomy (Word_id, synonym_id) затем добавить слово в таблицу слова и одну запись на синоним таблицы синонимов.

ОБНОВИТЬ (Добавлен 3-й синоним)

Ваше слово таблицу должно содержать каждое слово (все), ваш синонимный стол содержит только указатели на синонимы (не одно слово!) ..

Если у вас было три слова: A, B и C, которые являются синонимами, ваша БД будет

WORD_TABLE            SYNONYM_TABLE
ID | WORD             W_ID | S_ID
---+-----             -----+-------
1  | A                  1  |  2
2  | B                  2  |  1
3  | C                  1  |  3
                        3  |  1
                        2  |  3
                        3  |  2  

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



2-й подход

Вы также можете быть соблазнены (я не думаю, что вы должны!) Чтобы пойти с одной таблицей, имеющей отдельные поля для Word и список синонимов (или IDS) (Word_id, Word, Synonym_List). Остерегайтесь, что это противоречит к тому, как работает реляционные дБ (одно поле, один факт).

Другие советы

Я думаю, что 3 столбца, и только одна таблица лучше Word_table

ID | WORD | GroupID
---+----------------
1  |  A   |   1
2  |  B   |   1
3  |  C   |   1

Другой подход - хранить значение (это не использует главные слова, а значений таблицы, которые вместо этого группы)

Было бы хранить слова в таблице слов без синонимов и только с текстом, как это:

Много слов, один смысл

meaning_table

meaning_id
---
1
2
3

И хранить слова в другом столе, например, если A, B и C были все синонимы 1 значений

word_table

word_id | meaning_id | word
--------+------------+------
1       |  1         |   A
2       |  1         |   B
3       |  1         |   C

Хотя это очень похоже на то, что Гасан Амин Саран Предлагает, что у него есть ключевая разница, которую вы не выбираете из Word_Table, но вместо этого выбираете из именирования_table, это намного лучше, и я узнал, что сложно.

Таким образом, вы храните значение в одной таблице и столько слов для этого значения, как вам нравится в другом.

Хотя предполагает, что у вас есть 1 смысл за слово.

Много слов, много значений

Если вы хотите хранить слова с несколькими значениями, вам нужен еще один стол для многих отношений, и все это становится:

meaning_table
-------------
meaning_id
-------------
1
2
3

word_meaning_table
--------------------
word_id | meaning_id
--------+-----------
1       |  1         
2       |  1        
3       |  1         

word_table
--------------
word_id | word
--------+-----
1       |   A
2       |   B
3       |   C

Теперь вы можете иметь столько слов с таким количеством значений, как вы хотите, где любое слово может означать все, что вы хотите, и любое значение может иметь много слов.

Если вы хотите выбрать слово, и это синонимы, то вы делаете

SELECT 
meaning_id,word_id,word
FROM meaning_table 
INNER JOIN word_meaning_table USING (meaning_id)
INNER JOIN word_table USING (meaning_id)
WHERE meaning_id=1

Вы также можете хранить значение, которое пока не имеет ни слова, или что вы не знаете слова.

Если вы не знаете, что это означает, что он принадлежит, вы можете просто вставить новый смысл для каждого нового слова и исправить значение_id в Word_Table позже.

Затем вы можете даже хранить и выбрать слова, которые одинаковы, но имеют в виду различные вещи

SELECT 
meaning_id,word_id,word
FROM meaning_table 
INNER JOIN word_meaning_table USING (meaning_id)
INNER JOIN word_table USING (meaning_id)
WHERE word_id=1
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top