2013-11-06 6 views
1

Я хочу создать базу данных, где будет около 400 строк. Я хочу сделать базу данных доступной для поиска.Лучший способ поиска текстовой структуры?

Структура базы данных будет как:

Brand | model |additional products | price | search words | (this is 1 string, there will about 400 strings) 

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

Мой вопрос в том, как наилучшим образом проиндексировать все слова поиска? Я имею в виду 2-мя способами:

  1. В поле search words, все для поиска слова будут отображаться как: 1GB RAM, 512GB RAM, ATA, SATA… и так далее для каждой строки. Это означает, что ВСЕ слова будут находиться в одном и том же сыром на определенной строке, разделенной символом «,».

  2. Каждое слово поиска будет иметь свой собственный ряд: | search words 1| search words 2| search words 3 | search 4 words 5|… .. и так далее. В |search words 1| слово 1GB RAM будет. В | search words 2| слово 512GB RAM будет и так далее ... Это означает, что в строке, возможно, половина строки слов поиска будет заполнена поисковым словом.

В варианте 2 в базе данных будет более 50 строк и все слова поиска в разных столбцах (по 1 в каждом столбце для каждого продукта). В варианте 1 будет 1 строка со всеми словами в одном столбце для каждого продукта.

Или есть лучший способ сделать это?

+2

Вы в основном говорите о концепции маркировки?Я бы сделал таблицу для слов (или тегов) и соединительной таблицы, чтобы связать слово с элементом (независимо от того, что составляет бренд/модель). Имеет ли это смысл? –

ответ

1

Сохранение поисковых запросов в бесконечных дополнительных столбцах противоречит интуиции базы данных «нормализация» базы данных. Хранение всего в одном столбце, как правило, является последним вариантом, поскольку гораздо проще разбивать поисковые термины, если вы используете несколько столбцов.

Сделайте отдельную таблицу и присоединитесь к исходной таблице к этой таблице. Ваша структура будет выглядеть примерно так:

Оригинальный настольный

enter image description here

Новая таблица

enter image description here

Я добавил столбец первичного ключа в исходной таблице. Это упростит JOIN. Используйте следующее заявление для объединения двух таблиц:

SELECT original_table.* 
FROM original_table AS ABB2 
    JOIN new_table AS ABB1 ON ABB1.product_id = ABB2.id 
WHERE search_word = "your search term" 

Столбец «search_word» в новой таблице термины, связанные с каждым из ваших записей в исходной таблице.

Вы можете добавить подстановочные знаки «%» в ваш оператор WHERE, если вы хотите, чтобы поиск по нечеткой (вернуть все результаты, содержащие ваш поисковый запрос) был включен.

+0

могут ли они иметь более одного слова, связанного с этим методом? –

+0

@ gloomy.penguin Да, в приведенном выше примере нового примера запись Toyota Corolla из оригинальной таблицы имеет термины «японский», «toyota» и «семья», связанные с ней. У Honda есть термины «японский» и «маленький», связанные с ней. Соединение между двумя таблицами - столбец «product_id» в новой таблице и столбец «id» в исходной таблице. –

+0

ой ... так что вы просто повторяете слова в таблице. что произойдет, если вещи по-разному напишут? как '1GB' против' 1 GB'. он, похоже, поддерживает несогласованность и целостность данных. (Я мог бы просто болеть от вашего ответа, который был выбран) –

4

Несмотря на то, что был принят другой ответ ... Я объяснил эту идею еще немного, потому что я чувствую, что она соответствует «лучшим практикам» и позволяет ассоциировать более одного слова с одним элементом, не повторяя данные.

Вы должны закончить с тремя столами:

item:  item_id | Brand | model |additional products | price 

word:  word_id | word 

item_word: item_word_id | item_id | word_id 

данные будут выглядеть следующим образом:

товара:

item_id brand  model  additional_products price 
1   nokia  g5         100 
2   toshiba satellite       1000 

слово:

word_id word 
1   1 GB 
2   ATA 
3   SATA 
4   512BG RAM 

item_word:

item_word_id itwm_id  word_id 
1    1   1 
2    1   2 
3    2   3 
4    2   4 

так что nokia были эти слова: 1 GB, ATA и toshiba были эти слова: SATA, 512BG RAM. (Я понимаю, что это не имеет особого смысла, это просто пример)


затем запросить его как ..

select item.*, word 

from item 

     join item_word on item.item_id = item_word.item_id 

     join word on item_word.word_id = word.word_id 

и фильтровать нравится ...

select item.*, word 

from item 

     join item_word on item.item_id = item_word.item_id 

     join word on item_word.word_id = word.word_id 

where word in ('1GB RAM', '512GB RAM', 'ATA') 

, чтобы увидеть, что является наиболее значимым результатом можно даже попробовать ...

select item.item_id, item.brand, item.model, count(*) as word_count 

from item 

     join item_word on item.item_id = item_word.item_id 

     join word on item_word.word_id = word.word_id 

where word in ('1GB RAM', '512GB RAM', 'ATA') 

group by item.item_id, item.brand, item.model 

order by count(*) desc 

за то, что соответствует всем словам при условии, вы будете использовать ...

select item.item_id, item.brand, item.model, count(*) as word_count 

from item 

     join item_word on item.item_id = item_word.item_id 

     join word on item_word.word_id = word.word_id 

where word in ('1GB RAM', 'ATA') 

group by item.item_id, item.brand, item.model 

having count(*)=2 

где 3 - количество слов в вашем заявлении in ... word in ('1GB RAM', 'ATA'). в этом случае это было 2.


если вы просто делаете ...

item: Brand | model |additional products | price | long_word_string 

, то вы должны сделать ...

select * 
from item 
where long_word_string like '1GB RAM' or word like 'ATA' 

или даже ...

select * 
from item 
where long_word_string regexp '1GB RAM|ATA' 

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

это ли это имеет смысл? это отвечает на ваш вопрос?

Редактировать: мой ответ потерян до двух таблиц ... Я сейчас заинтересован в базе данных OP.

0

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

Смежные вопросы