Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2011, 16:48   #1
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
Вопрос Синонимия

такая структура:

то есть есть таблица с высказываниями и есть таблица связывающая высказывания как синонимы.

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

ну я надеюсь поняли, что ключ является синонимом слову река но слово река не является синонимом слову key хотя key и река является синонимом слову ключ (грубо говоря

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

Код:
SELECT TOP (10) MAX(querty_1.id) AS id, querty_1.caption
FROM querty RIGHT OUTER JOIN
synonym_querty ON querty.id = synonym_querty.synonym_querty_id OR querty.id = synonym_querty.querty_id RIGHT OUTER JOIN
synonym_querty AS synonym_querty_1 ON synonym_querty.querty_id = synonym_querty_1.querty_id RIGHT OUTER JOIN
querty AS querty_1 ON synonym_querty_1.querty_id = querty_1.id OR synonym_querty_1.synonym_querty_id = querty_1.id
WHERE     (querty.caption LIKE N'%река%')
GROUP BY querty_1.caption
реализовано на MS SQL Server. но это работает медленно, подскажите как оптимизировать запрос или изменить структуру чтобы убыстрить В РАЗЫ выполнение данного запроса
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 12.10.2011, 20:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В таблице synonym_querty реквизит id не обязателен. Пару реквизитов querty_id и synonym_querty_id можно использовать в качестве составного ключа.

В synonym_querty я бы предложил держать две записи на каждую пару высказывание-синоним:
Код:
querty: id=1, caption='река'
        id=2, caption='ручей'
synonym_querty: querty_id=1; synonym_querty_id=2
                querty_id=2; synonym_querty_id=1
Тогда запрос мог бы выглядеть так
Код:
SELECT TOP 10 q2.id,q2.caption
  FROM querty q1,synonym_querty s,querty q2
  WHERE q1.caption LIKE N'%река%' AND
        q1.id=s.querty_id AND
        s.synonym_querty_id=q2.id
  ORDER BY q2.caption
А если еще индексы сделаете на все реквизиты, то как ваш запрос, так и мой вариант будут летать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.10.2011, 00:24   #3
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

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

Цитата:
Сообщение от Аватар Посмотреть сообщение
А если еще индексы сделаете на все реквизиты, то как ваш запрос, так и мой вариант будут летать
я немного не в теме. что это такое? Расскажите)
Писано по д'Эльфийски

Последний раз редактировалось Stilet; 13.10.2011 в 08:02.
Лубышев вне форума Ответить с цитированием
Старый 13.10.2011, 00:38   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Посмотрите например http://msdn.microsoft.com/ru-ru/library/ms188783.aspx. Если пользуетесь для создания структуры таблиц и связей Platinum Erwin, то там это очень удобно и прозрачно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц