2010-05-27 3 views
1

Я работаю над приложением, которое предлагает альтернативные слова/фразы для ввода текста. У меня есть сомнения в том, что может быть хорошим дизайном для таблицы синонимов.Альтернативный дизайн для таблицы синонимов?

Конструктивные соображения:

  1. количество синонимов является переменной, т.е. football имеет один синоним (soccer), но in particular имеет два (particularly, specifically)
  2. если football является синонимом soccer, соотношение существует и в противоположном направлении.
  3. наша цель состоит в том, чтобы запросить слово и найти его синонимы
  4. мы хотим сохранить таблицу малых и сделать добавление новых слов легко

Что приходит на ум, это дизайн две колонки с

  • col a = word и
  • col b = delimited list of synonyms

Есть ли лучшая альтернатива? Как использовать две таблицы, одну для слов и другую для отношений?

Редактировать:
После прочтения ответов на мой взгляд пришел другой подход. Он использует одну таблицу столбцов со всеми синонимичными словами, каждая из которых завернута в маркер границы слова. При том, что я имею в виду что-то вроде
|in particular|particularly|specifically|
Тогда я запросить таблицу с
SELECT * FROM synonyms WHERE word LIKE '%|specifically|%'
И в коде я мусор предшествуют и завершающие | с и сделать раскол и есть синонимы.

Что-то плохое в этом, что я не вижу?

+0

Мне также интересно, хороший ли этот подход (последний). – Jerry2

ответ

-1

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

|in particular|particularly|specifically|

Тогда я запросить таблицу с

SELECT * FROM `synonyms` WHERE `word` LIKE '%|$word|%' 

И в коде я мусор предшествуют и завершающие | с и сделать explode и имеют синонимы:

$synonyms = $row['word']; 
$synonyms = explode('|', substr($synonyms, 1, -1)); 
unset($synonyms[$word]); 
4
  • цв а = слово и
  • цв б = разделителями список синонимов

Страшная идея. Каждый раз, когда вы добавляете синоним, вы должны изменить его в двух местах. Просто добавьте пары

(in particular, particularly) 
(in particular, specifically) 

и обеспечить, что в (a,b) и a < b. Таким образом, избыточности не будет.

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

2

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

  1. В таблице слов не будет повторяющихся слов.
  2. Проще обеспечить двустороннюю связь между словом и его синонимом.
  3. Сложнее писать инструкции SQL, которые работают в списках с разделителями.

Слово таблицы: 2 колонки Id, Слово

связь таблицы: 2 колонки WordId1, WordId2

Слова с двумя synomyms будет иметь одну строку в таблице Word, и две строки в таблице отношений.

1

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

Вы можете рассмотреть два дизайн таблицы, отображение всех слов на «каноническую вариацию» (как слово) или идентификатор (число):

syn1 -> 0x1234eef3 
syn2 -> 0x1234eef3 

Тогда отображение таблицы идентификаторов к списку синонимы:

eef3 -> (syn1, syn2) 
Смежные вопросы