Хранение инвертированного индекса в MySQL

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

Первый

termId - > docId
  a        doc2[locations],doc5[locations],doc12[locations] 
  b        doc5[locations],doc7[locations],doc4[locations] 

второй

termId - > docId
  a        doc2[locations]
  a        doc5[locations]
  a        doc12[locations]
  b        doc5[locations]
  b        doc7[locations] 
  b        doc4[locations]  

PS Lucene не вариант

1 ответ

Решение

Правильный дизайн таблицы зависит от того, как вы планируете использовать данные. Если вы планируете использовать такие строки, как "doc2[locations],doc5[locations],doc12[locations]" как есть - без дальнейшей постобработки, то ваш First дизайн в порядке.

Но если - как молчаливо говорит ваш вопрос - что вы иногда можете захотеть рассмотреть doc2[locations], doc5[locations]и т. д. как отдельные объекты, то вам обязательно следует использовать Second дизайн.

Вот несколько вариантов использования, которые показывают, почему Second дизайн лучше:

  • Если вы используете First и попросить все документы с termID = a тогда вы получите строку, какdoc2[locations],doc5[locations],doc12[locations] который вы затем должны разделить.

    Если вы используете Second, вы получите каждый документ в виде отдельной строки. Нет расщепления!

    Second структура удобнее.

  • Или предположим, в какой-то момент doc5[locations] изменения и вам нужно обновить таблицу. Если вы используете First дизайн, вам придется использовать некоторые довольно сложные строковые функции MySQL, чтобы найти и заменить подстроку во всех строках, которые ее содержат. (Обратите внимание, что MySQL не поставляется со встроенной заменой регулярных выражений.)

    Если вы используете Second дизайн, обновление легко:

    UPDATE table SET docId = "newdoc5[locations]" where docId = "doc5[locations]"
    
Другие вопросы по тегам